28

是否可以通过 WebAPI 访问 HttpContext.Current.Session ?我们可以让它继承 IRequiresSession 吗?

我有一个通用处理程序在我想要删除的 API 调用之后执行会话集。

public void AccountController : ApiController, IRequiresSessionState
{
public void Login()
{
setsession(){}
} 
}
4

2 回答 2

51

从技术上讲,是的,尽管我真的不建议这种做法 - 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 的基本原则 - 但是,如果你有一个非常好的理由,那么它是另一个更可重用的选项。

于 2013-11-10T00:15:25.173 回答
18

使用 Web Api 2.1 将其转换为 HttpContext 对我不起作用。但是我可以使用 HttpContextWrapper。

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;
于 2014-06-13T19:32:47.950 回答