2014-03-26 2 views
1

ASP.NET MVC 4 응용 프로그램을 개발 중입니다. userMenus 내가 정적 변수는 사용자 로그인 여부를 확인하는 것을 사용정적 변수 대체

public class MenuCL 
{ 
    public static List<UserMenu> userMenus = new List<UserMenu>(); // the static variable 
} 

public class UserMenu 
{ 
    public decimal MenuID { get; set; } 
    public string MenuName { get; set; } 
    public string Controller { get; set; }  
    public bool Permission { get; set; } 
} 

.에 때마다 사용자가 로그인을로드 정적 변수 사용자 정의 필터를 허가에서 메뉴/컨트롤러에 권한이 있습니다.

단일 사용자가 로그인했을 때 제대로 작동하지만 두 명 이상의 사용자가 로그인 한 경우 모두 엉망입니다. 오류 페이지 ("이 페이지에 대한 액세스 권한이 없습니다")는 다음과 같습니다. 메뉴/컨트롤러에 대한 권한이있는 사용자에게 표시됩니다.

만 지금은 내가이 글을 읽을 후에는, 모든 문제의 원인이되는 정적 변수의 실현 :

The static variables will be shared between requests. Moreover they will be initialized when application starts, so if the AppDomain, thus application gets restarted, their values will be reinitialized.

그래서 나는이 정적 변수에 대한 교체가 필요합니다. 누구든지 어떤 제안이 있습니까?

+0

비 정적으로 설정 하시겠습니까? 왜 그것은 처음부터 정적일까요? – nvoigt

+0

@nvoigt 사용자가 컨트롤러/메뉴에 대한 권한을 가지고 있는지 확인하기 위해 정적 변수를 사용합니다. 따라서 사용자가 로그 아웃 할 때까지 'userMenus'가 필요하므로 컨트롤러에 요청이있을 때마다 필자의 승인 필터를 체크인 할 수 있습니다. –

답변

1

세션 변수에 대한 액세스를 제공하는 정적 필드를 계속 사용할 수 있습니다. 세션 상태 서버 (또는 SQL Server)를 사용하는 웹 팜에서이 작업을 진행하기 위해

public static List<UserMenu> UserMenus 
    { 
     set 
     { 
      Session["UserMenus"] = value; 
     } 
     get 
     { 
      return Session["UserMenus"] == null ? new List<UserMenu>() : (List<UserMenu>) Session["UserMenus"]; 
     } 
    } 

, 당신은 넣어 [Serializable] 속성을 UserMenu의 상단에 필요합니다.

나는이 방법으로 코드를 수정할 필요가 없다고 생각합니다.

1

내 질문은 왜 정적 변수를 사용 하시겠습니까? 응용 프로그램에서 값을 공유 하시겠습니까? 이 경우 session을 더 잘 사용할 수 있습니다.

업데이트

UserMenu는의 비 정적 Listlst로서 가정한다. 그런 다음, 다음 메소드를 사용하여 세션에 저장하고 필요할 때마다이를 가져올 수 있습니다.

Session["usemenulist"] = lst 저장하려면;

는 다시 얻으려면

try 
{ 
lst = (List<UserMenu>)Session["usemenulist"]; 
} 
catch 
{ 
} 

처음으로 List에로드 데이터베이스 보라의 값을 얻는 경우에, 당신은 데이터베이스에서 그걸 얻기 위해 데이터베이스를 조회 할 수 있습니다 필요할 때마다 세션에 저장하는 대신 (이것은 Session 이외의 다른 옵션입니다. 원하는 경우이 방법을 시도해보십시오.)

+0

예. 신청서에 필요합니다. 세션을 사용하여 어떻게 할 수 있습니까? 'userMenus'리스트를 세션에 저장하고 필요할 때 목록으로 가져올 수 있습니까? –

+0

예, 답을 업데이트 할 수 있습니다. – Bharadwaj

+0

덕분에 도움이되었습니다. –