2012-01-20 18 views
26

Tôi đã gặp một hành vi tò mò về các phiên ASP. Bạn có thể buộc một bộ điều khiển ở bên ngoài phiên của người dùng - tôi muốn có thể thực hiện điều này để nhiều yêu cầu có thể thực hiện cùng một lúc và sử dụng một phiên làm cho chúng hoạt động liên tục.Viết cho một phiên chỉ đọc trong MVC 3+

Vô hiệu hóa các công trình trạng thái phiên như mong đợi:

[SessionState(SessionStateBehavior.Disabled)] 
public class SampleController : Controller 
{ 
    public ActionResult Test() 
    { 
     // Access to the session should be denied 
     object test = Session["test"]; 
     return Content(test); 
    } 
} 

Đi ~/mẫu/thử nghiệm sẽ ném một System.Web.HttpException, như mong đợi. Tuy nhiên, phiên read-only xuất hiện để hành xử một chút kỳ lạ:

[SessionState(SessionStateBehavior.ReadOnly)] 
public class SampleController : Controller 
{ 
    public ActionResult Test() 
    { 
     // Read from the session should be fine 
     object test = Session["test"]; 
     return Content(test); 
    } 

    public ActionResult SetTest(string value) 
    { 
     // Write to the session should fail 
     Session["test"] = value; 

     // Read it back from the session 
     object test = Session["test"]; 
     return Content(test); 
    } 
} 

Vì vậy, bây giờ tôi mong đợi ~/mẫu/thử nghiệm để làm việc, và nó. Các bit lẻ là tập hợp không quá: Tôi đi đến ~/Sample/SetTest? Value = foo và nó không ném một ngoại lệ, trên thực tế nó trả về "foo". Nếu tôi gọi ~/Sample/SetTest? Value = bar và sau đó ~/Sample/Test Tôi nhận được "thanh", cho biết phiên đã được ghi vào.

Vì vậy, trong một SessionStateBehavior.ReadOnly Tôi đã viết thành công cho phiên và đọc lại giá trị của mình.

Tôi nghĩ rằng đây có thể là do một trong ba điều:

  • Trong MVC 3 [SessionState(SessionStateBehavior.ReadOnly)] bị hỏng/bỏ qua.
  • [SessionState] bị ghi đè khi phiên được ghi và có thể ghi.
  • SessionStateBehavior.ReadOnly thực sự chỉ ra một số loại truy cập bẩn/lạc quan.

Có ai xác nhận không?

Tôi nghi ngờ điều cuối cùng là đúng, dựa trên số custom session provider documentation - nếu đó là cách triển khai hoạt động? Có ghi vào một lỗi 'rủi ro phiên' rủi ro phiên chỉ đọc '' (tức là lần cuối cùng ghi thắng) hay không có nguy cơ bị hỏng các phiên bị hỏng và vi phạm ngoại lệ?

Cập nhật

Nó trông như thế này là do thiết kế (từ Microsoft's docs):

Lưu ý rằng ngay cả khi các thuộc tính EnableSessionState được đánh dấu là ReadOnly, các trang ASP.NET khác trong cùng ứng dụng có thể ghi vào cửa hàng phiên, vì vậy yêu cầu dữ liệu phiên chỉ đọc từ cửa hàng có thể vẫn kết thúc khi chờ dữ liệu bị khóa được giải phóng.

Có vẻ như tùy chọn thứ hai ở trên là những gì nó thực sự thực hiện - phiên bị khóa và chế độ được thay đổi thành ghi.

Trả lời

9

~/mẫu/SetTest? Value = foo

Có nó sẽ không ném bất kỳ lỗi, nhưng nó cũng không kéo dài phiên giao dịch vào cuối yêu cầu.Bằng cách thiết kế bất kỳ thứ gì mà bạn ghi vào phiên được cập nhật (chỉ khi phiên có thể ghi) vào cuối vòng đời yêu cầu.

Trong thử nghiệm của tôi ~/Sample/Test không trả về gì cả.

Tôi nghĩ rằng chúng sẽ thất bại nhanh ở đây khi phiên là chỉ đọc.

Bằng cách mẫu của bạn cần phải được viết lại

string test = (string)this.Session["test"]; 
+0

Hmm, mẫu ở đây được đơn giản hóa mã cho những gì tôi đang làm, nhưng tôi nhận được phiên ghi vào - gọi _ ~/mẫu/SetTest ? value = foo_ và sau đó _ ~/Sample/Test_ đang trả về "foo" cho tôi. Thực sự nó nên lỗi, và nếu không nó chỉ nên không lưu phiên, nhưng nó chắc chắn tiết kiệm cho tôi. – Keith

+0

Bạn nói đúng, mẫu của tôi trong câu hỏi không ghi vào phiên, như mong đợi. Câu hỏi là tại sao ứng dụng của tôi vẫn có thể ghi vào đó? Tôi sẽ tìm hiểu những gì khác biệt và cập nhật câu hỏi ... – Keith

+0

như tôi đã đề cập trong câu trả lời ở trên, chúng không thất bại nhanh khi phiên là chỉ đọc và khi bạn đang cập nhật nó. Framework chỉ đơn giản là bỏ qua việc cập nhật phiên vào cuối yêu cầu. Trong khi đó, họ cho phép bạn sửa đổi cấu trúc phiên dù bạn thích nó. – chandmk

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