由于我们需要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=/
知道为什么它不起作用?如何避免为请求创建新会话?
答案 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
。