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

Sessionless ASP.NET MVC 2 requests have sessions yet

由于我们需要异步Ajax请求,所以需要禁用session状态。 Web 应用程序基于 ASP.Net 4 - MVC 2.

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

我正在使用以下方法将特定 HTTP 请求路由到 sessionless 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 和一个新的 session。例如,一个浏览器可能会请求 100 个 Ajax 个请求,每个请求都会生成一个新的 session。对于静态 Ajax 请求,我从不需要 session。我在 Chrome 网络监视器诊断的每个 Ajax 请求中看到以下行:

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

知道为什么它不起作用吗?我怎样才能避免为请求创建一个新的 session?

由于错误,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 sessionstate,它会继续设置 cookie。需要在我们定义的RouteHandlerclass中设置为Disabled