我正在使用C#,MVC和AngularJS。
我的问题是我的MVC程序创建了一个HttpContext.Current.Items["value"]
并在初始主控制器中设置了值,但是当我的AngularJS通过ajax调用命中应用程序时,它会创建一个新的会话,我可以' t获取我之前在HttpContext.Current.Items["value"]
调用中设置的值。
我有什么办法可以解决这个问题吗?我想继续使用HttpContext.Current.Items["value"]
。
为什么我的AngularJS调用会创建新的sessionid?我知道会话是新的的原因是因为我使用它时它们有不同的ID:
String strSessionId = HttpContext.Session.SessionID;
答案 0 :(得分:13)
HttpContext.Current.Items
是仅用于请求缓存的字典。一旦请求完成,其中的所有值都将超出范围。
// Will last until the end of the current request
HttpContext.Current.Items["key"] = value;
// When the request is finished, the value can no longer be retrieved
var value = HttpContext.Current.Items["key"];
HttpContext.Current.Session
是一个在请求之间存储数据的字典。
// Will be stored until the user's session expires
HttpContext.Current.Session["key"] = value;
// You can retrieve the value again in the next request,
// until the session times out.
var value = HttpContext.Current.Session["key"];
您的HttpRequest.Current.Items
值无法再次使用的原因是您在家庭控制器中设置了#34;"这是与您的AJAX呼叫完全不同的请求。
会话状态取决于cookie,因此如果将相同的cookie发送回服务器,则可以检索存储在那里的数据。幸运的是,如果您位于同一个域,AJAX will automatically send the cookie back to the server。
对于SessionID的更改,ASP.NET does not allocate storage for session until it is used。因此,您需要在会话状态中明确存储某些内容才能实际启动会话。有关详细信息,请参阅this MSDN article。