0

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

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

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

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 标头中,我都会看到一个带有新会话的新 set-cookie。例如,一个浏览器可能会请求 100 个 Ajax 请求,并且会为每个请求生成一个新的会话。而且我从不需要会话来处理静态 Ajax 请求。我在 Chrome 网络监视器诊断的每个 Ajax 请求中看到以下行:

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

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

4

1 回答 1

0

这是由于一个错误,routes.MapRoute接受新的IRouteHandler,但它是不合适的。您只需使用routes.Add而不是routes.MapRoute在 Global.asax 中设置 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。需要按照Disabled我们定义的 RouteHandler 类进行设置。

于 2015-03-16T01:20:35.913 回答