跨域的Web API中的会话状态访问

时间:2014-07-22 13:50:36

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

我有一个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工作。如果您需要更多详细信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

如果您尚未设置其他方法来执行SessionState,则默认行为是在服务器上执行InMemory。这就是您在其他ASP.NET服务器处理请求时遇到问题的原因。

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