是否可以通过WebAPI访问HttpContext.Current.Session?我们可以让它继承IRequiresSession吗?
我有一个通用处理程序在我想删除的API调用之后执行会话集。
public void AccountController : ApiController, IRequiresSessionState
{
public void Login()
{
setsession(){}
}
}
答案 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;