gpt4 book ai didi

c# - 如何在特定 Controller 上实现 session 感知 WEB API?

转载 作者:太空狗 更新时间:2023-10-30 00:40:17 26 4
gpt4 key购买 nike

我正在创建一些需要 session 感知的 WEB API 2 Controller 。我以前通过添加

来完成此操作
/// <summary>
/// Application_s the post authorize request.
/// </summary>
protected void Application_PostAuthorizeRequest()
{
HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}

但是,我们在解决方案中为站点的其他关键业务部分提供了 API Controller ,这些 Controller 已经过高度优化,并且返回大约 500 毫秒的响应,如果启用它,它会持续上升到 2 秒。这些 Controller 不需要 session 感知。

我们只需要给定 session 访问权限的某些 Controller ,我读过这篇文章 http://www.codeproject.com/Tips/513522/Providing-session-state-in-ASP-NET-WebAPI并且在考虑是否可以添加具有 session 感知的不同路由,但是在映射路由时没有 RouteHandler 属性。

有没有人有什么想法?

最佳答案

请记住,使用 SessionStateBehavior.Required 会产生相当大的影响,并且实际上只有部分路由需要对 session 的写入权限。最糟糕的是,由于必须锁定 session ,一次只能处理每个用户的单个请求。

也就是说,有一种方法可以根据路线以不同方式处理 session 。

您可以使用 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;
}
}

设置路由时,您可以使用扩展来定义特定的 session 状态行为:

config.Routes.MapHttpRoute(
"DefaultSessionApi",
"api/{controller}/{id}",
new { id = RouteParameter.Optional },
SessionStateBehavior.ReadOnly);

config.Routes.MapHttpRoute(
"WriteStuffToSession",
"api/writestufftosession",
null,
SessionStateBehavior.Required);

然后,在 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());
}
}

关于c# - 如何在特定 Controller 上实现 session 感知 WEB API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29408662/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com