无法在ASP.NET MVC IExceptionFilter中设置Cookie

时间:2015-01-14 00:33:05

标签: asp.net asp.net-mvc cookies filterattribute

我已经实现了一个自定义的IExceptionFilter来处理一些用户正在使用我们的应用程序正在使用的第三方库的异常。当发生这种特定的错误状态时,我需要修改用户的cookie(以清除其会话状态),但我发现的是没有cookie似乎使其脱离过滤器。不确定是什么问题,甚至不知道如何调试它。

我修改了功能位过滤器以简化意图,但这里是过滤器的要点。我已经确保它是第一个在控制器上运行的过滤器并且测试了删除HandleErrorAttribute过滤器也无济于事。在下面的代码运行之后,客户端上永远不会设置“somecookie”。

public class HandleSessionErrorAttribute : FilterAttribute, IExceptionFilter
{
    public void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null) throw new ArgumentNullException("filterContext");

        var exception = filterContext.Exception as HttpException;

        if (exception != null && exception.Message.Equals("The session state information is invalid and might be corrupted."))
        {
            filterContext.HttpContext.Response.Cookies.Add(new HttpCookie("somecookie")
            {
                Value = DateTime.Now.ToString(),
                Expires = DateTime.Now.AddMinutes(5),
            });              
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好的,想通了。两个问题阻碍了逻辑的成功:

  • HandleErrorAttribute必须在 之前运行任何修改响应的属性。 HandleErrorAttribute的部分实现是Clear() the response
  • CustomErrors必须开启才能使其正常工作

有效的初始化代码:

GlobalFilters.Filters.Add(new HandleErrorAttribute() { Order = 0 });
GlobalFilters.Filters.Add(new HandleSessionErrorAttribute() { Order = 1 });