我意识到会话和REST并不完全齐头并进,但是使用新的Web API无法访问会话状态吗?HttpContext.Current.Session永远是空的.
我使用WebAPI2实现了REST服务,该服务实现了管理由访问服务的不同客户端创建和加入的不同会话.
会话包含有关访问应用程序功能的信息以及已加入同一会话的参与者的信息.
每个客户端从服务器获取会话信息和访问列表,以便每秒进行同步.根据访问权限的更改,客户端功能将更改(启用/禁用).
我正在使用MemoryCache类在WebAPI服务中存储会话信息,如下所示.
public static class SessionManager{
private static object objForLock = new object();
public static List<Session> SessionCollection
{
    get
    {
        lock (objForLock)
        {
            MemoryCache memoryCache = MemoryCache.Default;
            return memoryCache.Get("SessionCollection") as List<Session>;
            // return HttpContext.Current.Application["SessionCollection"] as List<Session>;
        }
    }
    set
    {
        lock (objForLock)
        {
            MemoryCache memoryCache = MemoryCache.Default;
            memoryCache.Add("SessionCollection", value, DateTimeOffset.UtcNow.AddHours(5));
            //HttpContext.Current.Application["SessionCollection"] = value;  
        }
    }
}
}
我的问题是关于缓存的不一致行为.
当客户端发送同步调用时,它将产生不一致的结果.对于某些请求,客户端获取正确的数据,对于某些请求,客户端在某些请求后获取空数据替代.
我添加了调试器并监视对象的null结果,然后"memoryCache.Get("SessionCollection")"也为null.经过一些连续的请求后,它将再次成功.我不明白为什么这个对象不是持久的.
另外,我也试过"HttpContext.Current.Application ["SessionCollection"]",但同样的问题就在那里.
我读过"app pool recycle",它在微粒时间后回收所有缓存.如果我的缓存对象被app pool recycle回收,那么我该如何再次获取此对象?
请一些人帮我解决这个问题.提前致谢.
我正在尝试在我的IRouteHandler类的GettHttpHandler方法中启用Session,但session始终为null.有人能告诉我我做错了什么吗?
在global.asax我有
RouteTable.Routes.Add("All", new Route("{*page}", new MyRouteHandler()));
Session为null的MyRouteHandler类如下所示:
public class MyRouteHandler : IRouteHandler, IRequiresSessionState
{
    public System.Web.IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string test = HttpContext.Current.Session["test"].ToString();
        return BuildManager.CreateInstanceFromVirtualPath("~/Page.aspx", typeof(Page)) as Page;
    }
}
我做了一个小测试应用程序来显示问题.
有人能告诉我我做错了什么吗?
编辑添加:
是的,我真的需要路由处理程序中的会话数据.有许多原因,但可以轻松解释的是当用户可以切换到以预览模式浏览网站时.
该站点由数据库中的动态页面层次结构(/ page1/page2 ...)组成,可以正常发布或预览.浏览网站的内容制作者可以选择仅查看普通页面或查看发布到预览的页面.浏览模式存储在用户的会话中,因此路由处理程序需要知道浏览模式才能解析所请求的页面.
所以我真的需要在那个阶段的会议.
我在Umbraco旁边经营着一个MVC网站.MVC站点处理自己的身份验证,完全独立于Umbraco,以及ASP.NET Forms身份验证.它设置一个cookie并在内部使用它来跟踪事物.
在大多数情况下一切正常,但如果我使用上述cookie集登录到我的MVC站点,我尝试使用正确的Umbraco凭据登录到Umbraco管理部分,它会对我进行身份验证并将我重定向到管理部分但是WebAPI调用开始失败.第一个是对:调用:/umbraco/backoffice/UmbracoApi/UpdateCheck/GetCheck返回417 Missing token nullHTTP错误响应.
如果我删除我的自定义cookie并刷新页面一切正常.
我不明白我的饼干如何干扰Umbraco的.它不使用ASP.NET Forms身份验证或任何东西.
我知道REST应该是无状态的.
我的Web Api与我的MVC网站的同一个项目.我如何分享他们之间的会话?
我正在尝试使用Web Api 2的好东西并使用Ajax而不是构建RESTful API.
在asp.net mvc应用程序中,我想使用rest webservice返回与作为参数传递的会话ID相关联的用户名.
如何获取登录用户的sessionID?
我是否需要在登录方法中手动设置会话ID?
另外,如何使用会话ID获取用户信息?
任何帮助将不胜感激.谢谢 !
帐户控制器中的登录方法:
[HttpPost]
    public ActionResult LogIn(UserLoginView ULV, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            UserManager UM = new UserManager();
            string password = UM.GetUserPassword(ULV.EmailID);
            if (string.IsNullOrEmpty(password))
                ModelState.AddModelError("", "*The Email-ID or Password provided is incorrect");
            else
            {
                if (ULV.Password.Equals(password))
                {
                    FormsAuthentication.SetAuthCookie(ULV.EmailID, false);
                    if (Url.IsLocalUrl(returnUrl))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "*The Password provided is incorrect");
                }
            }
        }
        return View();
    }
用户控制器中的Web服务方法:
 public class UserController : ApiController
    { …我正在使用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", …