В моем приложении MVC MVC пользователи из другой системы с URL-адресом, который содержит свой собственный UserId. В первоначальном запросе пользователей после процесса аутентификации языковой параметр пользователя синхронизируется с соответствующим значением cookie.Asp.Net MVC Cookie Cookie Изменения, но не язык интерфейса пользователя до второго обновления
[HttpPost]
[AllowAnonymous]
public JsonResult Login(Guid userId, UserType userType)
{
try
{
IAccount account = null;
if (userType == UserType.SystemUser)
account = _accountService.CheckSystemUser(userId);
if (userType == UserType.Employee)
account = _accountService.CheckEmployee(userId);
if (account == null) throw new Exception(ErrorMessages.UserNotFound);
var roles = account.Roles.ToArray();
var principalModel = new CustomPrincipalViewModel
{
UserId = account.UserId.ToString(),
FullName = account.FullName,
Roles = roles,
Language = account.Language
};
var userData = JsonConvert.SerializeObject(principalModel);
var ticket = new FormsAuthenticationTicket(1, principalModel.FullName, DateTime.Now,
DateTime.Now.AddMinutes(30), false, userData);
var encryptedTicket = FormsAuthentication.Encrypt(ticket);
var requestCookie =Request.Cookies[FormsAuthentication.FormsCookieName];
if (requestCookie != null) requestCookie.Expires = DateTime.Now.AddDays(-1);
var responseCookie =Response.Cookies[FormsAuthentication.FormsCookieName];
if(responseCookie != null) responseCookie.Expires = DateTime.Now.AddDays(-1);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(cookie);
SetCulture(account.Language.CultureCode);
return Json(new {isSuccess = true, userFullName = account.FullName});
}
catch (BusinessExceptions.CannotConnectToCrmServiceException ex)
{
ElmahManager.Log(ex);
return Json(new { isSuccess = false, errorText = ErrorMessages.GeneralError });
}
catch (Exception exception)
{
ElmahManager.Log(exception);
return Json(new { isSuccess = false, errorText = ErrorMessages.GeneralError });
}
}
private void SetCulture(string culture)
{
culture = CultureHelper.GetImplementedCulture(culture);
var requestCookie =Request.Cookies["_culture"];
if (requestCookie != null) requestCookie.Expires = DateTime.Now.AddDays(-1);
var cultureCookie = Request.Cookies["_culture"];
if (cultureCookie == null)
{
cultureCookie = new HttpCookie("_culture")
{
Value = culture,
Expires = DateTime.Now.AddYears(1)
};
}
else
{
cultureCookie.Value = culture;
cultureCookie.Expires = DateTime.Now.AddYears(1);
}
Response.Cookies.Add(cultureCookie);
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(culture);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
}
После этого процесса, когда я изменить выбор языка пользователя из базы данных и обновите страницу, язык страницы не меняется. Тем временем, когда я проверяю значение cookie, я вижу, что это то же самое, что и текущее значение языка, но язык страницы не изменяется, пока страница не обновится во второй раз.
Вы имеете в виду, что после того, как пользователь Login() имеет язык по умолчанию, только после обновления вы можете получить соответствующий язык? –
И почему это изменилось? Результатом метода Login является json (вероятно, вызванный AJAX) - поэтому вызов метода входа, который устанавливает куки-файл культуры, не заставляет обновлять страницу. –
Вы правы @MaxMokrousov –