2009-09-03 3 views
14

세션 상태를 볼 수있게 변경해야합니다. IRequiresSessionState 마커 인터페이스에 대해 알았지 만이를 사용하는 방법을 파악하지 못했습니다. 나는 명백한 무엇인가 놓칠지도 모른다라고 생각한다. 여러분 중 한 분이 C# 전문가가 저에게 1-2-3 단계를 빨리 알려줄 수 있습니까 (예 :)? IRequiresSessionState - 어떻게 사용합니까?

  1. 새로운 클래스를 생성

    ,
  2. 그 안에 public interface IRequiresSessionState을 넣습니다.
  3. IRequiresSessionState('abra_cadabra')을 사용하여 값을 변경하십시오.

답변

11
  1. 이 클래스는 기존의 클래스 이름에 콜론을 추가하고 마커를 넣어 표시하려면 :

    이 링크를 체크 아웃, 당신은 HTTP 처리기를 구현하는 방법을 참조하십시오. 클래스가있는 경우 public class PageTools 으로 표시되면 public class PageTools : IRequiresSessionState 또는 두 인터페이스 모두 public class PageTools : IRequiresSessionState, IHttpHandler처럼 표시됩니다. 제 경우에는 제 수업이 첫 번째 수업에만 표시되어야했습니다. 내 처리기는 둘 다 필요했습니다.
  2. 방금 ​​입력 한 아이콘을 마우스 오른쪽 버튼으로 클릭하면 메뉴 (Visual Studio)에서 implement을 선택할 수 있으며 필요한 방법이 수업에 추가됩니다. 또는이를 검색하여 수동으로 추가 할 수 있습니다.
  3. IRequiresSessionState 마커가 있으면 세션 상태가 읽기 전용인지 테스트하고 새 http 핸들러를 설정하는지 테스트 할 수 있습니다.

    if (context.Handler is IReadOnlySessionState 
        || context.Handler is IRequiresSessionState) 
    { 
        context.Handler = Handler(); 
    } 
    
  4. HTTP 처리기 : MSDN 당신에게 HttpHandlers 및 HttpModules는에 대해 많은 걸 알 것이다. 제 경우에는 정상적인 읽기 전용 (Page_PreInit) 일 때 세션 상태에 액세스 할 수 있도록 더미 처리기가 필요했습니다.

    protected IHttpHandler Handler() 
    { 
        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler 
         as MyHttpHandler; 
        if (resourceHttpHandler != null) // set the original handler back 
        {     
         return resourceHttpHandler.OriginalHandler; 
        } 
        // at this point session state should be available  
        return HttpContext.Current.Handler; 
    } 
    
    public class MyHttpHandler : IHttpHandler, IRequiresSessionState 
    { 
        internal readonly IHttpHandler OriginalHandler; 
    
        public MyHttpHandler(IHttpHandler originalHandler) 
        { 
         OriginalHandler = originalHandler; 
        } 
        public void ProcessRequest(HttpContext context) 
        { 
         // do not worry, ProcessRequest() will not be called, 
         // but let's be safe   
         throw new InvalidOperationException(
          "MyHttpHandler cannot process requests."); 
        } 
        public bool IsReusable 
        { 
         // IsReusable must be set to false since class has a member! 
         get { return false; } 
        } 
    } 
    

Here 내가 많이 가지고 또는 내가 사용되는 매우 우아한 HttpModule의 클래스에 대한 참조 : 그래서 내 수업에서 나는이 추가되었습니다. 나는 이것이 누군가를 돕기를 바랍니다.

9

당신은 sessionState의 액세스를 얻기 위해 단지 IRequiresSessionState에서 HTTP 처리기 클래스를 파생해야합니다.

public class MyHttpHandler : IHttpHandler, IRequiresSessionState 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     var MyValue = context.Session["MyKey"] as String; 

     MyValue = "Hello World"; 

     context.Session["MyKey"] = MyValue; 
    } 

    public bool IsReusable 
    { 
     get { return true; } 
    } 
} 
+0

IRequiresSessionState에서 HTTP 처리기 클래스를 어떻게 설명 할 수 있습니까? – Praesagus

+0

딩. 땡땡. 내 세션 상태 변수가 내 도우미에서 작동 한 이유를 알아 내려고 몇 시간을 보냈다. self.thank = Ton (1). –

관련 문제