gpt4 book ai didi

c# - .NET Web API + session 超时

转载 作者:行者123 更新时间:2023-11-30 18:52:24 24 4
gpt4 key购买 nike

我正在使用 Web API Controller 创建 Web 服务。我希望能够创建一个 session 并检查 session 的状态。我有以下内容:

Controller :

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);

当我运行这段代码时,我一直在 session 中获取空引用。

HttpContext.Current.Session.Add("Username", user);                
//session["Username"] = user;
//session.Add("Username", user);

有谁知道为什么我不能将 session 变量设置为任何值。不管我使用哪种方法,这三种方法都行不通。代码取自另一篇文章。

最佳答案

这就是语义经常影响讨论的地方。人们将 Session 对象与无状态混淆。并且经常说:“不要使用 session ,因为它不是无状态的!”。

然而,它们的真正意思是您应该努力让您的 restful 调用成为幂等的,这意味着它们不会根据您在后台执行的操作而改变它们的行为。

session ,或运行时缓存,或任何你用来缓存数据的东西,对你的无状态设计没有影响,因为真的,下一步是什么?你的数据库也是有状态的?你不应该从中读取数据?显然是胡说八道;您的底层存储,无论是在内存中还是在磁盘上,都不会向客户端反射(reflect)您的状态。

因此,请务必使用 Ben Robinson 指出的 session 对象。但是,如果某些东西在 session 中,则永远不要让事实返回与 session 外某些东西不同的结果。

关于c# - .NET Web API + session 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27275974/

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