У меня есть проект MVC, в котором пользователь может изменить язык из меню.
Код контроллера:
[HttpGet]
public ActionResult ChangeLanguage(string Language)
{
Response.Cookies[SessionParams.LANGUAGE].Value = Language;
Response.Cookies[SessionParams.LANGUAGE].Expires = DateTime.Now.AddDays(7);
return Redirect(Request.UrlReferrer.PathAndQuery);
}
и код Global.asax.cs:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (Request.Cookies[SessionParams.LANGUAGE] != null)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Request.Cookies[SessionParams.LANGUAGE].Value);
}
}
Это прекрасно работает. Теперь я добавил класс, который реализует IAuthorizationFilter, чтобы убедиться, что я могу проверить, является ли сеанс все еще действительным перед каждым запросом (FilterConfig.cs):
public class ConnectedUserValidAuthorizationFilter : IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
UrlHelper urlHelper = new UrlHelper(filterContext.HttpContext.Request.RequestContext);
string loginUrl = urlHelper.Action("Login", "Account");
if (filterContext.HttpContext.Request.Url.AbsolutePath != loginUrl)
{
if (filterContext.HttpContext.Session[SessionParams.CONNECTED_USER] == null)
filterContext.HttpContext.Response.Redirect("~");
}
}
}
Почему-то после того, как я добавляю фильтр к глобальным фильтрам:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new ConnectedUserValidAuthorizationFilter());
}
Отладка показывает, что Request.Cookies
в Global.asax.cs больше не содержит значение для language
cookie.
Снятие фильтра возвращает значение.
Есть идеи, как это решить? Я попытался переместить код фильтра на Application_BeginRequest
, но в этом контексте сеанс еще не существует.