【问题标题】:When Web API 2.0 infrastructure populates Session values?Web API 2.0 基础架构何时填充 Session 值?
【发布时间】:2015-10-21 19:08:48
【问题描述】:

我的 Web API (2.0) 服务和 MVC (4.0) 代码在同一个 Web 应用程序中运行。我像通常的 HTTP 服务调用一样从 MVC 应用程序调用 Web API。

我在 WebApi 管道中添加了IAuthenticationFilter,因为我想在执行任何 Web Api 控制器之前进行一些与安全相关的验证。我将安全相关数据(例如 TokenId)保存在 HttpContext.Current.Session 中。例如。 HttpContext.Current.Session["TokenId"].

当我从 MVC 控制器或 WebApi 控制器访问时,Session 中保存的数据不知何故可用。但它在第一次运行过滤器时在AuthenticationFilter 中不可用,即当从 MVC 应用程序完成第一次 WebApi 调用时。

你能告诉我Session 何时被 WebApi 基础设施填充,为什么存储在 Session 中的值在第一次调用期间不可用?请注意,它们从第二次调用开始就可用

我已经验证了Session 中有值。只是在第一次执行期间它们在过滤器中不可用。

SessionStateBehavior.Required 已从 Global.asax 的 WebApi 正确设置。

(我知道不推荐使用 Session,但我现在必须使用它。)

【问题讨论】:

  • 我认为你遇到的主要问题是动作过滤器被缓存了,所以你必须依赖传递给它们的变量,这就是为什么每个人都推荐filterContext,但这就是来自 MVC。
  • 你使用任何 DI 容器吗?我认为您可以将会话注入到您的操作过滤器的构造函数中......

标签: asp.net-mvc asp.net-mvc-4 session asp.net-web-api asp.net-web-api2


【解决方案1】:

尝试在 global.ascx.cs 中使用这个 sn-p(我的是在 VB 中,但只是翻译代码)

Protected Sub Application_BeginRequest()
    if IsWebApiRequest() Then
        HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required)
    end if
end sub

Private function IsWebApiRequest() as Boolean
    return HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.Contains("api")
end function

对我来说,它可以工作并使会话在 AuthenticationFilter 中可用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多