ASP.NET MVC - 服务器无法在发送HTTP标头后修改cookie

时间:2014-01-25 12:52:01

标签: asp.net asp.net-mvc

我的应用程序控制器中有一个OnActionExecuted,用于检查用户是否仍然登录。当用户不再登录时,会话需要被销毁并重定向回主页而无需转到新页面。 (因此必须取消当前的请求。)

这是我的代码:

if (System.Web.HttpContext.Current.Session.IsNewSession)
        {
            if (System.Web.HttpContext.Current.Session["Userid"] != null)
            {
                // Check userid session
                filterContext.Controller.TempData["sessionError"] = 1;
                System.Web.HttpContext.Current.Session.RemoveAll();
                System.Web.HttpContext.Current.Response.BufferOutput = true;
                System.Web.HttpContext.Current.Response.Flush();
                RedirectToAction("Index", "Home");
                return;
            }
        }

然而,我在这段代码中遇到的问题是它给了我一个例外:

   Message:
Server cannot modify cookies after HTTP headers have been sent.

Source:
   at System.Web.HttpResponse.BeforeCookieCollectionChange()
   at System.Web.HttpCookieCollection.Add(HttpCookie cookie)
   at Topsite.Classes.GlobalFunctions.SetCookie(String name, String value, DateTime endDate)
   at Topsite.Controllers.ApplicationController.OnActionExecuted(ActionExecutedContext filterContext)
   at System.Web.Mvc.Controller.System.Web.Mvc.IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`1.End()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20()
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult)

有什么建议吗?

我确实发现了其他一些有同样问题的问题,我跟着他们但仍然收到了例外。这就是我寻求帮助的原因。

1 个答案:

答案 0 :(得分:2)

在OnActionExecuted上这样做太晚了。 您应该考虑使用OnActionExecuting。 http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onactionexecuting(v=vs.118).aspx