2016-10-18 3 views
1

ASP.Net MVCプロジェクトがあります。 Global.asaxのでは定義があります:ASP.Net MVC + static ConcurrentDictionary

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); 

ネイティブ(Webプロジェクト内)DoLoginと鉱山Iかのように、同様の動作するはずです:私はこのようにそれを行うました。ネイティブのDoLoginは完全に機能し、新しいユーザーがすべて問題なくApplication.UserSessions ConcurrentDictionaryに追加されます。しかし、私のDoLoginが呼び出されると、サーバー上の許可されたユーザーに関係なく、Application.UserSessions.Countは0として表示されます。また、Application.UserSessions.TryAddに達すると、ネイティブのDoLoginによって許可されたすべてのユーザーが不正になります。 どうすれば可能ですか?なぜ公共の静的なApplication.UserSessionsがWebプロジェクトコードと追加のアセンブリコードの中で異なった働きをするのですか?

更新:バグを発見しました。私の前に.dllを担当していた人がログを追加しました。 DoLoginを呼び出すたびに、... binフォルダに.xml形式のログファイルを保存していました。タダム! binフォルダが変更されているので、サーバーはすぐに再起動し、すべてのセッションが閉じられ、空のApplication.UserSessionsが表示されます。

+0

'追加のアセンブリプロジェクト'とは何ですか?それはMVCプロジェクトで使用されるアセンブリを生成する別のクラスライブラリですか? – Maarten

+0

はい、クラスライブラリです。起動時にロードされ、コントローラがWindsorコンテナに登録されています。 –

+0

何らかの理由で別の 'AppDomain'にあると私は考えることができます。 – Maarten

答えて

2

HttpContext.Applicationオブジェクトを使用して、Webアプリケーション全体で共有する必要のあるオブジェクトを保存してみてください。

https://msdn.microsoft.com/en-us/library/system.web.httpcontext.application(v=vs.110).aspx

あなたはUserSessionsのインスタンスを取得するためにMVCでそれを使用することができますGlobal.asax.cs

Application.Set("UserSessions", new ConcurrentDictionary<string, HttpSessionState>()) 

それを設定することができます。もちろん、

((ConcurrentDictionary<string, HttpSessionState>)HttpContext.Application.Get("UserSessions")) 

ますよアプリケーションリサイクルで内容を失う。

+0

突然、global.asax.csコードを変更できません。私は自分のDLLを変更するために自由です。 –

+0

それは多くのあなたの可能性を制限する.... :) –