是否可以从Web API访问HttpContext.Current.Session

Kub*_*ubi 27 asp.net asp.net-web-api

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

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

public void AccountController : ApiController, IRequiresSessionState
{
public void Login()
{
setsession(){}
} 
}
Run Code Online (Sandbox Code Playgroud)

Aar*_*ght 49

从技术上讲,是的,尽管我真的建议不要这样做 - REST API应该是完全无状态的(cookie和其他客户端状态都可以).

如果你绝对必须这样做,你可以抓住HTTP上下文,如下所示:

var context = Request.Properties["MS_HttpContext"] as HttpContext;
Run Code Online (Sandbox Code Playgroud)

此时,您只需使用其Session属性来获取会话.

请注意,这会破坏某些合同System.Net.Http- 特别是它意味着您的API控制器永远不能自托管,因为它们与ASP.NET耦合.如果您对此没有问题,并且您的API控制器可能无法从Web场正常工作,除非您重新设计所有内容以使用分布式会话 - 那么,请继续使用它.

PS它也可以使用IRequiresSessionState,但你不能在控制器本身上使用它,你需要在它上面使用它HttpControllerHandler并将其设置为RouteHandler.该MSDN线程中讨论了该方法.同样,我不能强烈反对这个想法,它违反了Web API的基本原则 - 但是,如果你有一个非常好的理由,那么它是另一种选择,它更可重复使用.

  • 每个人都给出了这个警告,但是几乎每个拥有授权的webapi都基本上和会话做同样的事情......它使用一些令牌来查找现状,说明他们是否可以做某事.(像JWT这样的东西有点不同,但是从安全专家那里得到了很多仇恨) (3认同)

Nic*_*ico 16

使用Web Api 2.1将它转换为HttpContext并不适用于我.但是我可以使用HttpContextWrapper.

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但Session参数为null. (9认同)