【问题标题】:Session state access in Web API across domains跨域 Web API 中的会话状态访问
【发布时间】:2014-07-22 13:50:36
【问题描述】:

我有一个 ASP.Net API 实现,在连续调用中存储和访问数据/变量的位置,我使用如下所示的会话状态对象,它可以在多个调用中成功访问,以通过一个单独的调用浏览器:

// Access the current session object
var blSession = HttpContext.Current.Session;

// create the BL object using the user id
BL accessBL = new BL(userID);

// Store the Bl object in the session object dictionary
blSession["UserBL"] = accessBL;

我必须在 Global.asax 中启用以下设置,才能访问 Session 对象:

protected void Application_PostAuthorizeRequest()
{
  // Enable session state in the web api post authorization
  HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}

当上面显示的 WebAPI 必须通过另一个 ASP.Net MVC 客户端访问时出现问题,该客户端单独托管在不同的机器上,当时相同的连续调用不会保持如上所示的状态,因此会导致一个例外,因为连续调用依赖于会话数据来继续。

当我在使用 Fiddler 调试器时看到类似的问题时,我也看到了类似的问题,因为它作为 Web 代理托管,因此通过它的连续调用也会失败,因为它不维护状态。据我了解,问题是由于跨域设置 Cookie,由于安全原因,这似乎不适用于跨域

我知道一种解决方法是使用应用程序范围的变量,如 Cache,但如果您有办法让 SessionState 工作,请提出建议。如果您需要更多详细信息,请告诉我。

【问题讨论】:

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


    【解决方案1】:

    如果您没有设置另一种方法来执行 SessionState,那么默认行为是在服务器上执行 InMemory。这就是当请求由不同的 ASP.NET 服务器处理时您会看到问题的原因。

    Web API 调用是无状态的。也就是说,它们不应像经典的 ASP.NET 应用程序那样执行,该应用程序依赖于框架将用户特定信息存储在跨 HTTP 请求的会话变量中。对于每个调用,传入一个特定于用户的标识符或令牌,然后您可以使用它来查找存储在您的后端中的信息。您可以将此信息存储在数据库或 MemCache 等分布式缓存中,以便更快地检索。

    【讨论】:

    • 好吧,这几乎意味着会话状态需要是 Outproc 才能使这种调用起作用。对于使用 Cookie 的默认 Inproc 设置是不可行的,请验证我的理解
    • 你是对的。默认会话设置会创建一个会话状态 cookie,该 cookie 随任何请求一起发送。 ASP.NET 运行时自动读取它并用适当的数据填充 Session 对象。无论您是否使用 Web API,您都不希望有这样的环境设置。 InProc 解决方案在网络农场场景中不起作用,除非您正在执行粘性会话,这违背了负载均衡器的目的。
    猜你喜欢
    • 2012-10-14
    • 2010-10-30
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多