【问题标题】:Sessionless ASP.NET MVC 2 requests have sessions yet无会话 ASP.NET MVC 2 请求还有会话
【发布时间】:2015-05-18 00:38:35
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这是由于一个错误,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。需要在我们定义的RouteHandler类中设置为Disabled

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 2011-05-18
      • 2011-05-15
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 2013-06-20
      相关资源
      最近更新 更多