ASP.NET Web API会话什么的?

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

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

谢谢。

那么,RESTdevise是无状态的。 通过添加会话(或其他types的任何其他types),您将使其成为有状态的,并打败拥有RESTful API的任何目的。

RESTful服务的全部思想是, 每个资源都是使用通用语法在超媒体链接中唯一可寻址的每个HTTP请求本身应该携带足够的信息,以便接收者处理它,使之与HTTP的无状态本质完全一致。

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

有了这个说法,如果你仍然愿意沿着这条路线走下去,那么在Web API中join会话的方式就变得很奇怪了,而且这里已经被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); } 

试一试 ;)

在WebApi 2中,您可以将其添加到global.asax

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

然后你可以通过以下方式访问会话:

 HttpContext.Current.Session 

如果数据足够小并且不存在安全问题,则可以使用Cookie。 基于相同的HttpContext.Current方法应该工作。

请求和响应HTTP标头也可以用来在服务调用之间传递信息。

现在在2017年与ASP.Net核心,你可以做到这一点解释这里。

Microsoft.AspNetCore.Session包提供用于pipe理会话状态的中间件。

ASP.NET Core中的会话和应用程序状态简介

已经在一个工作项目上进行了testing