.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;
}

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

的Global.asax.cs

WebApiConfig.RegisterRoutes(RouteTable.Routes);

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

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

有谁知道我为什么不能将会话变量设置为任何东西。 我使用的三种方法中的哪一种方法正在工作并不重要。 该代码正在从另一个帖子。


这是在Web API中设计的,因为它专为创建平稳的Web服务而设计。 为了真正地保持安宁,服务不应该有任何状态,例如/myserver/somendpoint/5对于给定动词的任何请求应该具有相同的结果。

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

protected void Application_PostAuthorizeRequest() 
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}

这就是语义经常使讨论变得浮躁的地方。 人们将Session对象与无状态混淆。 并经常说:'不要使用会话,因为它不是无状态!'。

然而,他们确实意味着你应该努力使你的平静呼叫成为幂等的,这意味着他们不会改变他们的行为,这取决于你在背景中做什么。

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

所以一定要像Ben Robinson指出的那样使用会话对象。 但是,如果IN会话中的某些内容返回不同的结果,那么请不要让这个事实发生,否则当某个事件退出会话时。


请不要!

Web API应该是statelessRESTful等。通过使用State你正在击败它的整个目的。

链接地址: http://www.djcxy.com/p/41143.html

上一篇: .NET Web API + Session Timeout

下一篇: What does REST's principle of statelessness actually means?