是否可以通过 WebAPI 访问 HttpContext.Current.Session ?我们可以让它继承 IRequiresSession 吗?
我有一个通用处理程序在我想要删除的 API 调用之后执行会话集。
public void AccountController : ApiController, IRequiresSessionState
{
public void Login()
{
setsession(){}
}
}
是否可以通过 WebAPI 访问 HttpContext.Current.Session ?我们可以让它继承 IRequiresSession 吗?
我有一个通用处理程序在我想要删除的 API 调用之后执行会话集。
public void AccountController : ApiController, IRequiresSessionState
{
public void Login()
{
setsession(){}
}
}
从技术上讲,是的,尽管我真的不建议这种做法 - REST API 应该是完全无状态的(cookie 和其他客户端状态是可以的)。
如果您绝对必须这样做,您可以像这样获取 HTTP 上下文:
var context = Request.Properties["MS_HttpContext"] as HttpContext;
此时您只需使用其Session属性来获取会话。
请注意,这违反了某些约定System.Net.Http
- 特别是这意味着您的 API 控制器永远不能自托管,因为它们与 ASP.NET 耦合。如果您对此感到满意,并且您的 API 控制器可能无法在 Web 场中正常工作,除非您重新架构所有内容以使用分布式会话 - 那么,去吧。
PS 也可以使用IRequiresSessionState
,但是不能在控制器本身上使用,需要在an上使用HttpControllerHandler
并设置为RouteHandler
. 此 MSDN 线程中讨论了该方法。同样,我不能强烈反对这个想法,它违反了 Web API 的基本原则 - 但是,如果你有一个非常好的理由,那么它是另一个更可重用的选项。
使用 Web Api 2.1 将其转换为 HttpContext 对我不起作用。但是我可以使用 HttpContextWrapper。
var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;