无会话ASP.NET MVC 2请求还有会话

时间:2015-03-15 23:52:16

标签: asp.net-mvc-2 session-less

由于我们需要Async Ajax请求,因此需要禁用会话状态。 Web应用程序基于ASP.Net 4 - MVC 2。

我知道[SessionState(SessionStateBehavior.Disabled)],但它可以在MVC 3+中使用。

我使用以下方法将特定HTTP请求路由到无会话HTTPContext [source]

public class CustomRouteHandler : IRouteHandler
    {
        public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext)
        {
            requestContext.HttpContext.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly);
            return new MvcHandler(requestContext);
        }
    }

在Global.asax中:

routes.MapRoute( _
          Nothing, _
          "ajaxrequest/{id}", _
          New With {.controller = "AjaxEngine", .action = "Index", .id = UrlParameter.Optional}, _
             New SessionLessRouteHandler()
        )

结果? 代码编译正确,运行时没有错误。但是,它不会改变任何内容,并且在每个Ajax请求的HTTP Header中,我看到一个带有新会话的新set-cookie。例如,浏览器可以请求100个Ajax请求,并且将为每个请求生成新会话。我永远不需要一个静态Ajax请求的会话。我在Chrome网络监视器诊断出的每个Ajax请求中看到以下行:

Set-Cookie:ASP.NET_SessionId=xlgxdzdxdeilws23prjns3cv; domain=mydomain.com; path=/

知道为什么它不起作用?如何避免为请求创建新会话?

1 个答案:

答案 0 :(得分:0)

由于错误,routes.MapRoute接受新的IRouteHandler,但这是不合适的。您需要在Global.asax中使用routes.Add而不是routes.MapRoute设置RouteHandler:

routes.Add(Nothing, New Route("ajaxrequest/{id}", New 
    RouteValueDictionary(New With { _
    Key .controller = "AjaxEngine", _
    Key .action = "Index", _
    Key .id = UrlParameter.Optional _
    }), New SessionLessRouteHandler()))

注意:通过使用ReadOnly会话状态,它继续设置cookie。需要在我们定义的RouteHandler类中将其设置为Disabled