NET Web API 会话还是什么?

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

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

谢谢。

156570 次浏览

设计 REST 是无状态的。通过添加会话(或其他类似的东西) ,您将使其成为有状态的,并且破坏了使用 RESTful API 的任何目的。

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

因此,无论您在这里尝试使用 Web API 做什么,如果您希望使用 RESTful API,最有可能的是重新构架。

也就是说,如果您仍然愿意沿着这条路线走下去,那么有一种将 session 添加到 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();

如果数据足够小且不存在安全问题,则可以使用 Cookie。相同的 HttpContext。目前的方法应该可行。

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

在 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

现在在2017年,使用 ASP.Net Core 你可以做到这一点。

会话包提供了用于管理会话状态的中间件。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
// Adds a default in-memory implementation of IDistributedCache.
services.AddDistributedMemoryCache();


services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
});
}


public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession();
}

文件: ASP.NET 内核中的会话和应用程序状态介绍

已经在一个工作项目上测试过了