use*_*065 63 session asp.net-web-api
我需要在每个API请求中检索我需要检索的会话(或ASP.NET Web API中的任何内容)中存储一些信息.我们将有一个api IIS网站,并将通过主机头添加多个网站绑定.当任何请求进入时,例如api.xyz.com,将检查主机头并将该网站信息存储在会话中,该会话将在调用数据库时在每个后续api请求中使用.
我知道ASP.NET Web API中没有对会话的支持.有没有其他方法来处理这种情况?我在哪里可以存储可以在每个后续请求中检索的信息?
谢谢.
Sor*_*ren 98
在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);
}
Run Code Online (Sandbox Code Playgroud)
试一试 ;)
Fil*_*p W 87
好吧,REST设计是无状态的.通过添加会话(或其他类似的东西),您可以使其成为有状态并且无法使用RESTful API.
RESTful服务的整体思想是每个资源都是唯一可寻址的,使用通用语法在超媒体链接中使用,并且每个HTTP请求应该自己携带足够的信息,以便其接收者处理它以与HTTP的无状态特性完全协调".
因此,无论您在此处尝试使用Web API,如果您希望拥有RESTful API,最有可能重新构建.
话虽如此,如果你仍然愿意沿着这条路走下去,那么有一种将会话添加到Web API的hacky方式,它已经由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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后将HttpControllerHandler添加到您的API路由:
route.RouteHandler = new MyHttpControllerRouteHandler();
Run Code Online (Sandbox Code Playgroud)
Dal*_*rzo 28
在WebApi 2中,您可以将其添加到global.asax
protected void Application_PostAuthorizeRequest()
{
System.Web.HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
}
Run Code Online (Sandbox Code Playgroud)
然后您可以通过以下方式访问会话:
HttpContext.Current.Session
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
130512 次 |
最近记录: |