我有一个MVC项目i,用户可以从菜单中更改语言。 控制器代码:
[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());
}
调试显示,Global.asax.cs中的Request.Cookies
不再拥有language
cookie的值。
删除过滤器会使值返回。
任何想法如何解决?我尝试将过滤器代码移至Application_BeginRequest
,但是该会话在该上下文中尚不存在。
答案 0 :(得分:0)
我最终在IActionFilter
函数内部实现了IAuthorizationFilter
而不是OnAuthorization
接口,并且使用了OnActionExecuting
中使用的相同逻辑。
这似乎更适合该任务,因为在每个Action请求之前调用OnActionExecuting
。似乎也可以使cookie保持完整。