【问题标题】:Is it possible to access HttpContext.Current.Session from Web API是否可以从 Web API 访问 HttpContext.Current.Session
【发布时间】:2023-03-28 07:37:01
【问题描述】:

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

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

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

【问题讨论】:

  • 您很可能需要设置 asp.net 才能使用 Forms 身份验证,但也有可能。

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


【解决方案1】:

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

如果您绝对必须这样做,您可以像这样获取 HTTP 上下文:

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

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

请注意,这违反了System.Net.Http 假设的某些约定——特别是这意味着您的 API 控制器永远不能自托管,因为它们与 ASP.NET 耦合。如果您对此感到满意,并且您的 API 控制器可能无法在 Web 场中正常工作,除非您重新架构所有内容以使用分布式会话 - 那么,去吧。

附:也可以使用IRequiresSessionState,但不能在控制器本身上使用,需要在HttpControllerHandler上使用,并将其设置为RouteHandler。该方法在this MSDN thread 中进行了讨论。同样,我不能强烈反对这个想法,它违反了 Web API 的基本原则 - 但是,如果你有一个 真的 很好的理由,那么它是另一个更可重用的选项。

【讨论】:

  • 每个人都给出这个警告,但是几乎每个具有授权的 webapi 基本上都与会话做同样的事情......它使用一些令牌来查找现有状态,说明他们是否可以做某事. (像 JWT 这样的东西做的事情有点不同,但受到安全专家的讨厌)
  • 谢谢@KeithNicholas,我正要问你是否有Auth token / cookie,那么如果没有这个,你如何获取它!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2017-09-28
    相关资源
    最近更新 更多