Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 跨域Web API中的会话状态访问_Asp.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

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

Asp.net 跨域Web API中的会话状态访问,asp.net,asp.net-mvc,asp.net-web-api,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

我有一个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中启用以下设置,才能访问会话对象:

protected void Application_PostAuthorizeRequest()
{
  // Enable session state in the web api post authorization
  HttpContext.Current.SetSessionStateBehavior(SessionStateBehavior.Required);
}
当必须通过另一个ASP.Net MVC客户机访问上面显示的WebAPI(该客户机单独托管在另一台机器上)时,就会出现问题,此时相同的连续调用不会保持上面显示的状态,因此会导致异常,因为连续调用依赖于会话数据来继续

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


我知道一个解决方法是使用应用程序范围的变量,比如Cache,但是请建议您是否有办法让SessionState工作。如果您需要更多详细信息,请与我联系。

如果您没有设置执行SessionState的替代方法,则默认行为是在服务器上的内存中执行。这就是为什么当请求由其他ASP.NET服务器处理时会出现问题


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

好的,这几乎意味着会话状态需要为Outproc才能使此类调用工作。对于使用Cookie的默认Inproc设置,这是不可行的,请验证我的理解是否正确。默认会话设置创建会话状态cookie,该cookie随请求一起发送。ASP.NET运行时会自动读取该数据,并使用适当的数据填充会话对象。无论是否使用Web API,您都不希望环境设置为这样。InProc解决方案在web场场景中不起作用,除非您执行的是不符合负载平衡器用途的粘性会话。