Sco*_*eed 4 c# asp.net asp.net-mvc asp.net-web-api
我正在创建一些需要会话感知的 WEB API 2 控制器。我以前通过添加来做到这一点
/// <summary>
/// Application_s the post authorize request.
/// </summary>
protected void Application_PostAuthorizeRequest()
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
Run Code Online (Sandbox Code Playgroud)
但是,我们在站点的其他业务关键部分的解决方案中有 API 控制器,这些控制器已经过高度优化,返回大约 500 毫秒的响应,如果打开它,它会持续长达 2 秒。这些控制器不需要会话感知。
我们只需要提供会话访问权限的某些控制器,我已经阅读了这篇文章http://www.codeproject.com/Tips/513522/Providing-session-state-in-ASP-NET-WebAPI并且正在考虑是否可以添加具有会话意识的不同路由,但在映射路由时没有RouteHandler属性。
有没有人有任何想法?
请记住,使用 SessionStateBehavior.Required 会产生相当大的影响,实际上只有部分路由需要对会话进行写访问。最糟糕的是每个用户一次只能处理一个请求,因为会话必须被锁定。
话虽如此,有一种方法可以根据路线以不同的方式处理会话。
您可以使用IHttpRoute.DataTokens向您的路由添加自定义字段。我创建了一个小的扩展类来分别为每个路由设置 SessionStateBehavior:
public static class SessionHelper
{
private static SessionStateBehavior GetSessionStateBehavior(IDictionary<string, object> dataTokens)
{
return dataTokens.ContainsKey("SessionStateBehavior") ? (SessionStateBehavior)dataTokens["SessionStateBehavior"] : SessionStateBehavior.Default;
}
public static SessionStateBehavior GetSessionStateBehavior(this IHttpRoute route)
{
return GetSessionStateBehavior(route.DataTokens);
}
public static SessionStateBehavior GetSessionStateBehavior(this RouteData routeData)
{
return GetSessionStateBehavior(routeData.DataTokens);
}
public static void SetSessionStateBehavior(this IHttpRoute route, SessionStateBehavior behavior)
{
route.DataTokens["SessionStateBehavior"] = behavior;
}
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, SessionStateBehavior behavior)
{
return MapHttpRoute(routes, name, routeTemplate, defaults, null, behavior);
}
public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, SessionStateBehavior behavior)
{
var route = routes.CreateRoute(routeTemplate, defaults, constraints);
SetSessionStateBehavior(route, behavior);
routes.Add(name, route);
return route;
}
}
Run Code Online (Sandbox Code Playgroud)
设置路由时,您可以使用扩展来定义特定的会话状态行为:
config.Routes.MapHttpRoute(
"DefaultSessionApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional },
SessionStateBehavior.ReadOnly);
config.Routes.MapHttpRoute(
"WriteStuffToSession",
"api/writestufftosession",
null,
SessionStateBehavior.Required);
Run Code Online (Sandbox Code Playgroud)
然后,在PostAuthorizeRequest事件中,您可以解析您的路由并相应地设置 SessionStateBehavior:
protected void Application_PostAuthorizeRequest()
{
var context = new HttpContextWrapper(HttpContext.Current);
var path = context.Request.AppRelativeCurrentExecutionFilePath;
if (path == null || !path.StartsWith("~/api"))
{
return;
}
var routeData = RouteTable.Routes.GetRouteData(context);
if (routeData != null)
{
context.SetSessionStateBehavior(routeData.GetSessionStateBehavior());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2614 次 |
| 最近记录: |