2013-11-09 91 views
25

访问HttpContext.Current.Session是否有可能访问HttpContext.Current.Session通过的WebAPI?我们可以让它继承IRequiresSession吗?是否有可能从网络API

我有一个通用的处理程序做一个会议,我想删除API调用后设置。

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

您很可能需要将asp.net设置为使用表单身份验证,尽管否则可能有可能。 –

+0

我使用Web窗体 – Kubi

回答

47

技术上,是的,但我真的建议反对这种做法 - 一个REST API应该是完全无状态(cookies和其他客户端的状态是OK)。

如果你绝对必须此,你可以抓住的HTTP上下文,像这样:

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

此时你只需要使用它的Session属性来获取会话。

注意,这打破了由System.Net.Http承担某些合同 - 具体地说,它意味着你的API控制器绝不可能自托管,因为他们连接到ASP.NET。如果您确信这一点,并且事实上您的API控制器可能无法在网络服务器场中正常运行,除非您重新设计所有使用分布式会话的设计 - 那么就去做吧。

P.S.也可以使用IRequiresSessionState,但不能在控制器本身上使用它,您需要在HttpControllerHandler上使用它并将其设置为RouteHandler。该方法在this MSDN thread中讨论。同样,我不能强烈反对建议足够这个想法,它违反了一个Web API的基本原则 - 但是,如果你已经有了一个真正很好的理由,那么它的另一种选择是多一点可重复使用的。

+0

每个人都给出了这样的警告,但几乎每一个有授权基本上的WebAPI做同样的事情会话....它使用了一些象征性的发现现有的状态,说他们是否可以或不可以做什么。 (像JWT这样的事情有点不同,但是从安全专家那里得到很多讨厌的东西) –

14

铸造它的HttpContext没有我使用网络API 2.1工作。但是我可以使用HttpContextWrapper。

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

这可以工作,但Session参数为空。 – MyNameIsKo

相关问题