2009-09-03 38 views
14

Tôi cần có thể thay đổi khi tôi có thể thấy trạng thái phiên. Tôi đã tìm hiểu về giao diện điểm đánh dấu IRequiresSessionState, nhưng không thể tìm ra cách sử dụng nó. Tôi nghĩ rằng tôi có thể thiếu một cái gì đó hiển nhiên. Có thể một trong các bạn C# guru cho tôi một bước 1-2-3 nhanh chóng (ví dụ)?IRequiresSessionState - làm cách nào để sử dụng?

  1. Tạo một lớp mới,
  2. Đặt public interface IRequiresSessionState trong đó.
  3. Sử dụng IRequiresSessionState('abra_cadabra') để thay đổi giá trị.

Trả lời

11
  1. Để đánh dấu một lớp học thêm một dấu hai chấm để tên lớp hiện có và đặt điểm đánh dấu. Nếu tôi có một lớp học: public class PageTools Được đánh dấu, nó sẽ trông giống như public class PageTools : IRequiresSessionState hoặc với cả hai giao diện, public class PageTools : IRequiresSessionState, IHttpHandler. Trong trường hợp của tôi, lớp học của tôi chỉ cần được đánh dấu đầu tiên. Người xử lý của tôi cần cả hai.
  2. Nếu bạn nhấp chuột phải vào điểm đánh dấu bạn vừa nhập, bạn có thể chọn implement từ menu (studio trực quan) và các phương thức cần thiết sẽ được thêm vào lớp học của bạn. Hoặc bạn có thể tra cứu chúng và thêm chúng theo cách thủ công.
  3. Khi bạn có điểm đánh dấu IRequiresSessionState, bạn có thể kiểm tra xem trạng thái phiên có chỉ đọc hay không và nếu vậy hãy đặt trình xử lý http mới.

    if (context.Handler is IReadOnlySessionState 
        || context.Handler is IRequiresSessionState) 
    { 
        context.Handler = Handler(); 
    } 
    
  4. Các handler http: MSDN sẽ cho bạn biết rất nhiều về HttpHandlers và HttpModules. Trong trường hợp của tôi, tôi cần một trình xử lý giả để tôi có thể truy cập trạng thái phiên khi nó thường chỉ đọc (Page_PreInit). Vì vậy, trong lớp học của tôi, tôi nói thêm điều này:

    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 là một tham chiếu đến một lớp HttpModule rất thanh lịch mà từ đó tôi có nhiều hoặc những gì tôi sử dụng. Tôi hi vọng điêu nay se giup được ai đo.

9

Bạn phải chỉ để lấy được HTTP Handler lớp học của bạn từ IRequiresSessionState để có được quyền truy cập sessionState.

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

Bạn có thể giải thích cách tôi sẽ xử lý lớp HTTP từ IRequiresSessionState không? – Praesagus

+0

Ding. Ding. Đã dành một vài giờ cố gắng tìm ra lý do tại sao biến trạng thái phiên của tôi đã hoạt động trong trình trợ giúp của tôi. self.thank = Tấn (1). –

2

Giao diện IRequiresSessionState là giao diện điểm đánh dấu và không chứa phương pháp, vì vậy bạn không thể sử dụng nó theo cách bạn đặt câu hỏi. Bạn chỉ thực hiện giao diện trong trình xử lý HTTP để xác định rằng trình xử lý yêu cầu quyền truy cập đọc và ghi vào các giá trị trạng thái phiên.

Để xem cách bạn thực hiện nó trong một handler HTTP, hãy kiểm tra liên kết này: http://www.willasrari.com/blog/irequiressessionstate-and-dynamic-data-in-static-pages/000262.aspx

Các vấn đề liên quan