2011-11-07 18 views
25

Sự khác biệt giữa IRequiresSessionStateIReadOnlySessionState bên cạnh sự không có khả năng thứ hai để lưu thay đổi đối với biến phiên là gì?IRequiresSessionState vs IReadOnlySessionState

Cả hai đều cung cấp cho tôi khả năng truy cập vào các biến phiên trong số HttpHandler của mình. Nhưng tại sao tôi thích IReadOnlySessionState? Nó chỉ hạn chế tôi khỏi lưu phiên cho yêu cầu tiếp theo.
Hay nó mang lại cho tôi lợi thế về hiệu suất trên IRequiresSessionState?

Khi nào tôi muốn sử dụng IReadOnlySessionState hơn IRequiresSessionState?

Trả lời

24

Một khác biệt quan trọng là IRequiresSessionState đặt khóa độc quyền vào phiên hiện tại, do đó có khả năng hạn chế số yêu cầu đồng thời từ người dùng hiện tại. (Để biết thêm thông tin về hiện tượng khóa này, hãy xem Is it possible to force request concurrency when using ASP.NET sessions?)

Ngược lại, IReadOnlySessionState không có khóa độc quyền.

Đây là điều tương tự được ghi trong renad's helpful answer to an almost identical SO question.

Các tài liệu chính thức tốt nhất mà tôi đã tìm thấy cho điều này là từ MSDN bài viết Session State Providers:

Ba trong số những phương pháp quan trọng nhất trong một nhà cung cấp trạng thái phiên là GetItem, GetItemExclusive, và SetAndReleaseItemExclusive. Hai cái đầu được gọi bởi SessionStateModule để lấy một phiên từ nguồn dữ liệu. Nếu trang được yêu cầu triển khai giao diện IRequiresSessionState (theo mặc định, tất cả các trang triển khai IRequiresSessionState), thì trình xử lý sự kiện AcquireRequestState của SessionStateModule gọi phương thức GetItemExclusive của nhà cung cấp trạng thái phiên. Từ "Exclusive" trong tên phương thức có nghĩa là phiên sẽ chỉ được truy xuất nếu nó hiện không được sử dụng bởi một yêu cầu khác. Mặt khác, nếu trang được yêu cầu triển khai giao diện IReadOnlySessionState (cách phổ biến nhất để đạt được điều này là bao gồm thuộc tính EnableSessionState = "ReadOnly" trong chỉ thị @ Page) của trang, SessionStateModule gọi phương thức GetItem của nhà cung cấp. Không yêu cầu độc quyền ở đây, vì các truy cập đọc chồng chéo được SessionStateModule cho phép.

Note vĩ tuyến giữa việc sử dụng một cách rõ ràng các giao diện và sử dụng các chỉ thị EnableSessionState Page:

  • EnableSessionState = False < -> không có I * giao diện sessionState
  • EnableSessionState = True < -> IRequiresSessionState giao diện
  • EnableSessionState = ReadOnly < -> IReadOnlySessionState
+2

+1 cho khóa - ** cực kỳ ** quan trọng nếu ứng dụng web có thể xử lý một số yêu cầu không đồng bộ cùng lúc sử dụng trạng thái Phiên. –

1

Follow này http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

IRequiresSessionState có nguồn gốc từ System.Web.SessionState sử dụng giao diện này, chúng tôi truy cập vào phiên HttpHandler và Class nộp

Nếu bạn cần truy cập chỉ đọc đến phiên, thực hiện IReadOnlySessionState giao diện.

+0

Vâng, tôi biết những gì 'IRequiresSessionState' được sử dụng cho, nhưng tại sao' IReadOnlySessionState' tồn tại? Tại sao tôi thích sử dụng nó? –

+0

Tại PostMapRequestHandler, các hoán đổi HttpModule từ trình xử lý thực tế đến một trình xử lý tùy chỉnh, thực hiện IRequiresSessionState hoặc IReadOnlySessionState để nó có thể sử dụng giao diện. Tại PreRequestHandlerExecute bạn có thể truy cập phiên và chuyển hướng nếu cần. Tại PostAcquireRequestState bạn trao đổi lại cho trình xử lý gốc. – coder

6

Giao diện đó kiểm soát xem khung sẽ lưu trạng thái phiên hiện tại vào cuối yêu cầu hay không. Nó tạo ra sự khác biệt lớn hơn khi bạn đang sử dụng bộ nhớ trạng thái phiên không xử lý. Trong trường hợp đó, không có giao diện, hệ thống sẽ vẫn lưu trữ dữ liệu phiên trong cơ sở dữ liệu từ xa, ngay cả khi nó không thay đổi (hệ thống không theo dõi liệu dữ liệu phiên đã được sửa đổi trong yêu cầu) hay chưa. Khi bạn sử dụng giao diện IReadOnlySessionState, giai đoạn ghi lại bị bỏ qua.

+2

Từ nơi bạn nhận được thông tin đó? bạn có thể tham khảo liên kết không? –

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