C# HttpContext.Current.Session始终为空

C# HttpContext.Current.Session始终为空,c#,session,asp.net-web-api,C#,Session,Asp.net Web Api,我知道这个话题已经提了很多,但我还没有找到一个能解决我问题的话题 我有一个从ActionFilterAttribute派生的GuestTokenValidationAttribute类,其中我从标头接收一个令牌,并将其用作字符串令牌。然后我想将该令牌添加到会话中,但无论我做什么,会话始终为空 请各位朋友,我们将非常感谢任何指导或帮助 代码示例如下: public class GuestTokenValidationAttribute : ActionFilterAttribute { p

我知道这个话题已经提了很多,但我还没有找到一个能解决我问题的话题

我有一个从ActionFilterAttribute派生的GuestTokenValidationAttribute类,其中我从标头接收一个令牌,并将其用作字符串令牌。然后我想将该令牌添加到会话中,但无论我做什么,会话始终为空

请各位朋友,我们将非常感谢任何指导或帮助

代码示例如下:

public class GuestTokenValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
         string token;
        try
        {
           token =  actionContext.Request.Headers.GetValues("Authorization-Token").First();
        }
        catch (Exception)
        {
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
                Content = new StringContent("Unauthorized User")
            };
            return;
        }

        if(string.IsNullOrEmpty(token))
        {
          actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
                Content = new StringContent("Unauthorized User")
            };
            return;  
        }

        try
        {
            var repository = DependencyResolver.Current.GetService<IRepository<Guest>>();
            var guest = repository.GetAll().FirstOrDefault(x => x.Token == token);
            if(guest == null)
            {
                actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
                {
                    Content = new StringContent("Unauthorized User")
                };
                return;  
            }

        }
        catch (Exception)
        {
            actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized)
            {
                Content = new StringContent("Unauthorized User")
            };
            return;
        }




       HttpContext.Current.Session.Add("guesttoken" ,token);

        base.OnActionExecuting(actionContext);

    }
公共类GuestTokenValidationAttribute:ActionFilterAttribute
{
公共重写无效OnActionExecuting(HttpActionContext actionContext)
{
字符串标记;
尝试
{
token=actionContext.Request.Headers.GetValues(“授权令牌”).First();
}
捕获(例外)
{
actionContext.Response=新的HttpResponseMessage(HttpStatusCode.Unauthorized)
{
内容=新的StringContent(“未授权用户”)
};
返回;
}
if(string.IsNullOrEmpty(令牌))
{
actionContext.Response=新的HttpResponseMessage(HttpStatusCode.Unauthorized)
{
内容=新的StringContent(“未授权用户”)
};
返回;
}
尝试
{
var repository=DependencyResolver.Current.GetService();
var guest=repository.GetAll().FirstOrDefault(x=>x.Token==Token);
if(guest==null)
{
actionContext.Response=新的HttpResponseMessage(HttpStatusCode.Unauthorized)
{
内容=新的StringContent(“未授权用户”)
};
返回;
}
}
捕获(例外)
{
actionContext.Response=新的HttpResponseMessage(HttpStatusCode.Unauthorized)
{
内容=新的StringContent(“未授权用户”)
};
返回;
}
HttpContext.Current.Session.Add(“guesttoken”,token);
base.OnActionExecuting(actionContext);
}
移植到asp.net以解决诸如会话和视图状态之类的问题,这些问题与web的本质是完全对立的。正如您所知,在MVC中,所有操作和响应都应被视为无状态请求,在处理请求之前和之后都不应留下任何内容,并假定GC将收集ViewBags、SE中的所有数据变量、变量等


因此,正如强烈建议的那样,处理这类事情的常用方法是使用通过纯web提供的本机功能,如cookie、html表单、html输入、url参数等。

您在web.config中启用了会话吗?我有,我有,这是在API控制器中吗?@C Sharper,是的,这是API控制器请注意:问题是关于WebAPI的,不是MVC.WebAPI不支持会话。要启用会话,请参阅haim700的注释。WebAPI只是MVC的一部分,它是在MVC的运行时库上构建和运行的。因此,MVC和WebAPI自然没有区别