繁体   English   中英

ASP.Net MVC +静态ConcurrentDictionary

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM