.NET Web API +会话超时

Pro*_*ing 2 c# session-state asp.net-web-api

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

WebConfig

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

的Global.asax.cs

WebApiConfig.RegisterRoutes(RouteTable.Routes);
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我继续在会话中获取空引用.

HttpContext.Current.Session.Add("Username", user);                
//session["Username"] = user; 
//session.Add("Username", user);
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么我不能将会话变量设置为任何东西.无论我使用哪种方法都不起作用并不重要.该代码来自另一篇文章.

Ger*_*art 9

这就是语义经常引起讨论的地方.人们将Session对象与无状态混淆.并经常说:"不要使用会话,因为它不是无国籍的!".

然而,它们的确意味着你应该努力使你的宁静召唤成为幂等的,这意味着他们不会根据你在后台做的任何事情来改变他们的行为.

会话,或运行时缓存,或者用于缓存数据的任何内容,对您的无状态设计没有影响,因为真的,下一步是什么?你的数据库也是有状态的吗?你不应该从中读取数据?废话显然; 您的底层存储,如果它在内存中或在磁盘上没有反映您的状态到客户端.

因此,正如Ben Robinson指出的那样,尽可能地使用会话对象.但是,如果有什么东西是IN会话,那么永远不要让事实返回不同的结果,然后当某些东西是会话时.


Ben*_*son 7

这是Web API中的设计,因为它旨在创建宁静的Web服务.为了真正安静,服务不应该具有任何类型的状态,即/myserver/somendpoint/5对于具有给定动词的任何请求应该具有相同的结果.

但是,如果这不适合您,您可以通过向global.asax添加以下内容来启用Web API中的会话.

protected void Application_PostAuthorizeRequest() 
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
Run Code Online (Sandbox Code Playgroud)