Моя установка:SQL запись в таблице пользователей ASP.NET не сохраняет
- ASP.NET 4.5 Web API (на Azure) Сохранение данных SQL дб (также на Azure)
- AngularJS веб фронт end (другой веб-сайт Azure)
Когда пользователь сначала регистрируется, я показываю им «вводное начало». Вступление должно запускаться только один раз - я регистрирую временную метку даты запуска ввода в качестве настраиваемого поля в пользовательской таблице ASP.NET.
Представьте мое удивление, когда я вхожу в систему (как пользователь) и увижу вступительное ДВУХ.
Передняя часть AngularJS правильно отправляет сообщение «intro view» на ASP.NET api, и api отвечает сообщением об успешном завершении. Однако, когда я смотрю на необработанные данные в db, метка времени определенно НЕ обновляется. Следовательно, пользователь увидит ввод второй раз (в какой момент метка времени записывается в db должным образом).
У меня дерьмовое обходное решение. После того как клиент запрашивает токен маркера OAuth с моего сервера, клиент затем запрашивает информацию пользователя (чтобы решить, показывать или не показывать тур). Ожидание 100 мс, а затем отправка сообщения «Просмотр тура» обратно на сервер маскирует проблему.
Я не видел ЛЮБЫХ других проблем хранения данных в любой точке. Поскольку наш db находится на Azure, я не могу подключить Profiler, и built in auditing не дает мне никаких подсказок.
Есть ли что-то о запросе маркера, который оставляет личность ASP.NET в смешном состоянии? И требуется короткое ожидание, прежде чем вы сможете написать в таблицу? Являются ли настраиваемые поля, которые расширяют базовую настройку Identity, подверженной таким проблемам? Возможно, UserManager делает что-то странное в своем черном ящике?
У кого-нибудь есть предложения по продолжению отладки этой проблемы? Или когда-либо слышал о чем-нибудь подобном?
Вот соответствующий код, который должен быть обновление «тур просматривалась» метку времени в БД:
[HttpPost, Route("UserInfo")]
public async Task<IHttpActionResult> UpdateUserInfo(UpdateBindingModel model)
{
var currentUser = UserManager.FindById(User.Identity.GetUserId());
if (model.FirstName != null)
{
currentUser.FirstName = model.FirstName;
}
if (model.LastName != null)
{
currentUser.LastName = model.LastName;
}
if (model.SetIntroViewCompleteDate)
{
currentUser.IntroViewCompleteDate = DateTime.UtcNow;
}
if (model.SetIntroViewLaunchDate)
{
currentUser.IntroViewLaunchDate = DateTime.UtcNow;
}
if (model.SetTipTourCompleteDate)
{
currentUser.TipTourCompleteDate = DateTime.UtcNow;
}
if (model.SetTipTourLaunchDate)
{
currentUser.TipTourLaunchDate = DateTime.UtcNow;
}
IdentityResult result = await UserManager.UpdateAsync(currentUser);
if (result.Succeeded)
{
var data = new UserInfoViewModel
{
FirstName = currentUser.FirstName,
LastName = currentUser.LastName,
IntroViewLaunchDate = currentUser.IntroViewLaunchDate
};
return Ok(data);
}
return InternalServerError();
}
UPDATE ********* 4/18
Я также пытался полностью отойти от материалов UserManager. Я пробовал следующие изменения (вытаскивание пользовательских данных из таблицы, как я хотел бы получить доступ к любым другим данным), но он по-прежнему ведет себя одинаково. Я начинаю думать, что ввод пользовательских полей на объекте ApplicationUser это плохая идея ...
Новый дб получить и сохранить выглядит следующим образом:
ApplicationDbContext newContext = new ApplicationDbContext();
var currentUser = await (from c in newContext.Users
where c.Email == User.Identity.Name
select c).SingleOrDefaultAsync();
//update some values
await newContext.SaveChangesAsync();
Вы говорите, что API отвечает «сообщение успеха». FROM, что я вижу в вашем коде, вы получите ответ 200, а также 'UserInfoViewModel'. Это так? Вы также уверены в первом вызове, что маркер отправляется с запросом (т. Е. Дает ли пользователь User.Identity.GetUserId() 'правильный пользователь)? Наконец, возможно, стоит добавить логику, которую вы прокомментировали, - она выполняется до того, как вы обновите пользователя, так что, возможно, что-то происходит там –
Correct - 200 плюс модель представления. Токен отправляется, и клиентский вызов правильно аутентифицирован. Хороший вопрос. Я обновляю исходный вопрос с помощью сокращенного кода ... это довольно обыденно. – waffles