2013-03-23 7 views
7

В моем веб-приложении я использую System.Web.HttpContext.Current, и он представляет текущий контекст, мне было интересно, как он доступен извне, пока я не заметил, что его член static! Пока его статический член, как он сохраняет свое значение, а если два запроса получены почти в одно и то же время. как следующее:System.Web.HttpContext.Current статичен между запросами

#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 

я пропустил-то понять или есть трюк в нем или что?

ответ

5

Это очень умный вопрос!

HttpContext.Current реализован как локальная переменная потока. Фактически, он реализован с использованием LogicalCallContext, но он ведет себя как нить-локальный.

Думай об этом, как это:

[ThreadLocal] 
public static HttpContext Current; 

И да, это означает, что только первичный поток запроса может получить доступ к нему. Он будет нулевым для дополнительных потоков, которые вы начнете.

+0

Сэр, Большое спасибо за ваш ответ! теперь все гораздо яснее, но у меня есть один вопрос: что вы подразумеваете под его внедрением с использованием LogicalCallContext? и еще раз спасибо за ваш очень полезный ответ. – Hilmi

+0

Когда вы открываете свойство с помощью Reflector, вы обнаружите, что это значение получается не из статического потока-локального поля, а из CallContext и, в свою очередь, из LogicalCallContext. Это низкоуровневые классы инфраструктуры, о которых я мало что знаю. Они по существу являются потоковыми данными-структурами (но не совсем). Я думаю, что каждый запрос в ASP.NET или WCF имеет один такой контекст вызова, но я могу ошибаться в этом. – usr

+0

большое спасибо, сэр, я буду искать больше об этом предмете, но ваш ответ был окончен! еще раз спасибо. – Hilmi

Смежные вопросы