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

时间:2013-11-09 23:49:23

标签: asp.net asp.net-web-api

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

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

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

2 个答案:

答案 0 :(得分:48)

技术上,是的,虽然我真的建议反对这种做法 - REST API应该是完全无状态的(cookie和其他客户端状态都可以)。

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

var context = Request.Properties["MS_HttpContext"] as HttpContext;

此时您只需使用其Session属性即可获得会话。

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

P.S。也可以使用IRequiresSessionState,但您无法在控制器本身上使用它,您需要在HttpControllerHandler上使用它并将其设置为RouteHandler。该方法在this MSDN thread中讨论。再一次,我不能强烈推荐反对这个想法,它违反了Web API的基本原则 - 但是,如果你有一个真的它的充分理由,那么它是另一种可重复使用的选择。

答案 1 :(得分:15)

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

var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;