2013-03-23 36 views
7

Trong ứng dụng web của tôi, tôi đang sử dụng System.Web.HttpContext.Current và nó đại diện cho bối cảnh nhấn hiện tại, tôi đã tự hỏi làm thế nào nó có thể truy cập từ khắp mọi nơi cho đến khi tôi nhận thấy rằng một thành viên static của nó! Trong khi một thành viên tĩnh của nó như thế nào nó giữ giá trị của nó trong khi nếu hai yêu cầu nhận được trong gần như cùng một lúc. như sau:System.Web.HttpContext.Current là tĩnh giữa các yêu cầu

#Req1----> | set the value of the static field to req1 
#Req2----> | set the value of the static field to req2 
#Req1  | use that static its supposed to be req2 while its req1 

tôi đã bỏ lỡ hiểu một cái gì đó hoặc có một trick trong nó hoặc những gì?

Trả lời

5

Đây là một câu hỏi rất thông minh!

HttpContext.Current được triển khai dưới dạng biến chủ đề cục bộ. Trên thực tế, nó được thực hiện bằng cách sử dụng LogicalCallContext nhưng hoạt động như một thread-local.

nghĩ về nó như thế này:

[ThreadLocal] 
public static HttpContext Current; 

Và vâng, điều này có nghĩa rằng chỉ có các chủ đề yêu cầu chính có thể truy cập vào nó. Nó sẽ được null trên các chủ đề bổ sung mà bạn bắt đầu.

+0

Thưa bạn, Cảm ơn rất nhiều câu trả lời của bạn! mọi thứ bây giờ rõ ràng hơn nhiều, nhưng tôi có một câu hỏi, ý của bạn là gì với 'nó được thực hiện bằng cách sử dụng LogicalCallContext', và cảm ơn một lần nữa cho câu trả lời rất hữu ích của bạn. – Hilmi

+0

Khi bạn mở thuộc tính mở với Reflector bạn thấy rằng giá trị không đến từ một trường tĩnh-local tĩnh nhưng từ CallContext và lần lượt từ LogicalCallContext. Họ là những tầng lớp hạ tầng cấp thấp mà tôi biết rất ít. Chúng chủ yếu là cấu trúc dữ liệu trên mỗi luồng (nhưng không hoàn toàn). Tôi nghĩ rằng mỗi yêu cầu trong ASP.NET hoặc WCF có một bối cảnh cuộc gọi như vậy nhưng tôi có thể sai về điều đó. – usr

+0

cảm ơn rất nhiều Ngài, tôi sẽ tìm hiểu thêm về chủ đề này, nhưng câu trả lời của bạn đã hoàn tất! cảm ơn một lần nữa. – Hilmi

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