.NET Web API + Session Timeout
本文关键字:Session Timeout API Web NET | 更新日期: 2023-09-27 18:33:08
我正在使用Web api控制器创建一个Web服务。我希望能够创建会话并检查会话的状态。我有以下几点:
控制器:
public string Get(string user, string pass)
{
bool loginValue = false;
loginValue = UserNamepassword(user, pass);
if (loginValue == true)
{
HttpContext.Current.Session.Add("Username", user);
//session["Username"] = user;
//session.Add("Username", user);
if ((string)HttpContext.Current.Session["Username"] != null)
{
HttpContext.Current.Session.Add("Time", DateTime.Now);
return "Username: " + (string)HttpContext.Current.Session["Time"] + (string)HttpContext.Current.Session["Username"];
}
return "Logged in but session is not availabe for " + (string)HttpContext.Current.Session["Username"];
}
else
return "Login failed for " + user;
}
网络配置
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapHttpRoute(
name: "SessionApi",
routeTemplate: "api/{controller}/{user}/{pass}",
defaults: new { user = RouteParameter.Optional, pass = RouteParameter.Optional }
);
route.RouteHandler = new MyHttpControllerRouteHandler();
}
public class MyHttpControllerHandler: HttpControllerHandler, IRequiresSessionState
{
public MyHttpControllerHandler(RouteData routeData): base(routeData){ }
}
public class MyHttpControllerRouteHandler: HttpControllerRouteHandler
{
protected override IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpControllerHandler(requestContext.RouteData);
}
}
全球.asax.cs
WebApiConfig.RegisterRoutes(RouteTable.Routes);
当我运行此代码时,我不断在会话中获取空引用。
HttpContext.Current.Session.Add("Username", user);
//session["Username"] = user;
//session.Add("Username", user);
有谁知道为什么我不能将会话变量设置为任何内容。我使用哪种方法都不起作用。代码取自另一个帖子。
这就是语义经常遮蔽讨论的地方。人们将会话对象与无状态混淆。并且经常说:"不要使用会话,因为它不是无状态的!
然而,它们的真正含义是,你应该努力让你成为幂等的宁静呼吁,这意味着他们不会根据你在后台所做的任何事情来改变他们的行为。
会话,或运行时缓存,或者你用来缓存数据的任何内容,对你的无状态设计没有影响,因为实际上,下一步是什么?您的数据库也是有状态的?你不应该从中读取数据吗?显然是胡说八道;基础存储(如果位于内存中或磁盘上)不会向客户端反映你的状态。
因此,请务必使用 Ben Robinson 指出的会话对象。但是,永远不要让某些内容在会话中的事实返回与某些内容不在会话时返回不同的结果。
这是 Web
API 中的设计使然,因为它是为创建 restful Web 服务而设计的。要真正休息,服务不应该有任何状态,即 对于具有给定谓词的任何请求,/myserver/somendpoint/5
应具有相同的结果。
但是,如果这不适合您,您可以通过将以下内容添加到 global.asax 来在 Web API 中启用会话。
protected void Application_PostAuthorizeRequest()
{
System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
<</div>
div class="answers"> 拜托,不要!
Web API
应该是stateless
、RESTful
等。通过使用State
,你正在破坏它的全部目的。