ASP.NETWebAPI会话还是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (29)

我需要在会话中(或者在ASP.NET Web API中)存储我需要在每个API请求中检索的一些信息。我们将有一个api IIS网站,并通过主机头添加多个网站绑定。例如,当有任何请求进入时,api.xyz.com会检查主机头,并将该网站信息存储在会话中,以便在调用数据库时在每个后续api请求中使用该信息。

我知道在ASP.NET Web API中不支持会话。有没有其他办法来处理这种情况?我可以在哪里存储可在每个后续请求中检索的信息?

提问于
用户回答回答于

那么,设计中的REST是无状态的。通过添加会话(或其他类型的任何其他类型),将使其成为有状态的,并打败拥有RESTful API的任何目的。

RESTful服务的全部思想是每个资源都可以使用通用语法在超媒体链接中唯一地寻址,并且每个HTTP请求都应该携带足够的信息,以便接收方能够对其进行处理,使其与HTTP的无状态特性完全一致“

因此,无论在此尝试如何使用Web API,如果希望拥有RESTful API,最有可能需要重新架构。

有了这个说法,如果你仍然愿意沿着这条路线前进,那么在Web API中添加会话的方式很棘手,并且已经由Imran在这里发布http://forums.asp.net/t/1780385.aspx/ 1

代码(虽然我不会真的推荐):

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

public class ValuesController : ApiController
{
   public string GET(string input)
   {
       var session = HttpContext.Current.Session;
       if (session != null)
       {
           if (session["Time"] == null)
           {
               session["Time"] = DateTime.Now;
           }
           return "Session Time: " + session["Time"] + input;
       }
       return "Session is not availabe" + input;
    }
}

然后将HttpControllerHandler添加到API路由中:

route.RouteHandler = new MyHttpControllerRouteHandler();
用户回答回答于

在Global.asax中添加

public override void Init()
{
    this.PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest;
    base.Init();
}

void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
{
    System.Web.HttpContext.Current.SetSessionStateBehavior(
        SessionStateBehavior.Required);
}

扫码关注云+社区