2016-10-18 5 views
1

ASP.Net MVC 프로젝트가 있습니다. (클래스 라이브러리 나는 새 어셈블리를 추가했다 지금ASP.Net MVC + 정적 ConcurrentDictionary

public class LoginController : BaseController 
{ 
    public ActionResult DoLogin(AuthorizationViewModel authorizationViewModel) 
    { 
     ... 
     var session = System.Web.HttpContext.Current.Session; 
     Application.UserSessions.TryAdd(session.SessionID, session); 

그것은 충분히 잘 작동했지만 :

public class Application : System.Web.HttpApplication 
    { 
     public static ConcurrentDictionary<string, HttpSessionState> UserSessions = new ConcurrentDictionary<string, HttpSessionState>(); 
... 

그것은이 같은 인 LoginController에 사용되고 : Global.asax에 거기에 대한 정의이다 프로젝트) 대체 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 및 광산은 비록 I로, 유사한 작동합니다. 기본 DoLogin은 완벽하게 작동합니다. 모든 새로운 사용자가 문제없이 Application.UserSessions ConcurrentDictionary에 추가됩니다. 그러나 Doinein이 호출 될 때 서버에 권한이있는 사용자가 있는지 여부에 관계없이 Application.UserSessions.Count는 0으로 표시됩니다. Application.UserSessions.TryAdd에 도달하면 기본 DoLogin에 의해 허가 된 모든 사용자가 무단으로 사용됩니다. 어떻게 가능합니까? 공공 정적 Application.UserSessions가 웹 프로젝트 코드 및 추가 어셈블리 코드 내에서 다르게 작동하는 이유는 무엇입니까?

업데이트 : 버그를 발견했습니다. 전에 .dll에 대한 책임이있는 사람이 로그를 추가했습니다. DoLogin을 호출 할 때마다 ... bin 폴더에 .xml 형식의 로그 파일을 저장하고있었습니다. 따 - ​​댐! bin 폴더가 수정되었으므로 서버가 즉시 다시 시작되고 모든 세션이 닫히고 빈 Application.UserSessions가 표시됩니다.

+0

정확히 '추가 조립 프로젝트'는 무엇입니까? MVC 프로젝트에서 사용되는 어셈블리를 생성하는 별도의 클래스 라이브러리입니까? – Maarten

+0

예, 클래스 라이브러리입니다. 시작시로드되고 컨트롤러가 Windsor 컨테이너에 등록됩니다. –

+0

어떤 이유로 든 다른 'AppDomain'에 있다고 생각할 수있는 유일한 것. – Maarten

답변

2

HttpContext.Application 개체를 사용하여 웹 응용 프로그램에서 공유해야하는 개체를 저장해보십시오.

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

그게 당신의 가능성을 많이 제한 .... .... –