ASP.Net MVC +静态ConcurrentDictionary

时间:2016-10-18 07:06:21

标签: c# .net asp.net-mvc

有一个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项目中)和我的(在额外的装配项目中)应该像我一样工作。 Native DoLogin工作正常,每个新用户都被添加到Application.UserSessions ConcurrentDictionary中而没有任何麻烦。但是,当调用我的DoLogin时,无论服务器上是否有授权用户,Application.UserSessions.Count都显示为0。当达到Application.UserSessions.TryAdd时,本机DoLogin授权的所有用户都将被未经授权。 这怎么可能?为什么公共静态Application.UserSessions在Web项目代码和附加汇编代码中的工作方式不同?

更新:我发现了这个错误。在我之前负责.dll的人添加了日志。在每次调用DoLogin时,他都将.xml格式的日志文件存储在... bin文件夹中。 TA-坝!由于bin文件夹被修改,服务器立即重新启动,所有会话都关闭,我看到一个空的Application.UserSessions。

1 个答案:

答案 0 :(得分:2)

尝试使用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"))

当然,您将丢失应用程序回收中的内容。