[英]ASP.Net MVC + static ConcurrentDictionary
有一个ASP.Net MVC项目。 在global.asax中有一个定义:
public class Application : System.Web.HttpApplication
{
public static ConcurrentDictionary<string, HttpSessionState> UserSessions = new ConcurrentDictionary<string, HttpSessionState>();
...
像这样在LoginController中使用它:
public class LoginController : BaseController
{
public ActionResult DoLogin(AuthorizationViewModel authorizationViewModel)
{
...
var session = System.Web.HttpContext.Current.Session;
Application.UserSessions.TryAdd(session.SessionID, session);
它工作得很好,但是现在我不得不用替代的LoginController添加一个新的程序集(类库项目)。 该库在启动时正在加载,并且AlternativeLoginController正在Windsor容器中注册)。 我这样做是这样的:
public class AlternativeLoginController : BaseController
{
public ActionResult DoLogin(AuthorizationViewModel authorizationViewModel)
{
...
var session = System.Web.HttpContext.Current.Session;
Application.UserSessions.TryAdd(session.SessionID, session);
像我一样,本机DoLogin(在Web项目中)和我的DoLogin(在其他组装项目中)应该类似地工作。 本机DoLogin可以完美运行,每个新用户都可以轻松地添加到Application.UserSessions ConcurrentDictionary中。 但是,当调用我的DoLogin时,无论服务器上是否有授权用户,Application.UserSessions.Count都显示为0。 并且当到达Application.UserSessions.TryAdd时,所有由本机DoLogin授权的用户都将遭到未授权。 这怎么可能? 为什么公共静态Application.UserSessions在Web项目代码和附加程序集代码中的工作方式不同?
Upd:我发现了这个错误。 在我之前负责.dll的人已经添加了日志。 在每次致电DoLogin时,他都将.xml格式的日志文件存储在... bin文件夹中。 TA-坝! 由于bin文件夹被修改,服务器立即重新启动,所有会话都关闭,并且我看到一个空的Application.UserSessions。
尝试使用HttpContext.Application对象存储需要在Web应用程序中共享的对象。
https://msdn.microsoft.com/en-us/library/system.web.httpcontext.application(v=vs.110).aspx
您可以在Global.asax.cs中进行设置
Application.Set("UserSessions", new ConcurrentDictionary<string, HttpSessionState>())
您可以在MVC中使用它来获取UserSessions的实例
((ConcurrentDictionary<string, HttpSessionState>)HttpContext.Application.Get("UserSessions"))
当然,您将在应用程序回收中丢失内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.