无会话 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?
- 我试过 Rick 的the other solution,但是结果和上面一样。
由于错误,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
由于我们需要异步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?
- 我试过 Rick 的the other solution,但是结果和上面一样。
由于错误,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