Всегда ли ASP.NET-запросы выполняют BeginRequest и EndRequest в одном потоке? - PullRequest
3 голосов
/ 05 сентября 2010

Всегда ли BeginRequest и EndRequest для ASP.NET HttpApplication происходят в одном и том же потоке для данного HTTP-запроса от клиента?

Причина, по которой я спрашиваю, заключается в том, что я вижу очень странное поведение, когдаПеременная ThreadStatic не является нулевой внутри метода Init для IHttpModule.

Я устанавливаю для этой переменной ThreadStatic значение в BeginRequest и обнуляю его в EndRequest.

Однако мой метод Init IHttpModule должен вызываться вне периода BeginRequest / EndRequest, поэтому я могу думать, что эта переменная ThreadStatic будет иметь значение при вызове моего метода Init, если EndRequest происходит впоток, отличный от BeginRequest, и, следовательно, значение все еще не равно нулю позже, когда ASP .NET пытается использовать этот же поток для создания нового экземпляра HttpApplication ...

Я запускаю IIS 7 в интегрированном режиме.

Ответы [ 3 ]

3 голосов
/ 06 сентября 2010

Всегда ли BeginRequest и EndRequest для ASP .NET HttpApplication всегда выполняются в одном и том же потоке для данного HTTP-запроса от клиента?

Нет. Существуют варианты выполнения асинхронных операций в запросе, которые приводят к тому, что конец запроса обрабатывается в другом потоке. Это не нормальный случай.

См. Атрибут Async директивы @Page: http://msdn.microsoft.com/en-us/library/ydy4x04a.aspx

Введение в использование асинхронных страниц см. В статье журнала MSDN: « Асинхронные страницы в ASP.NET 2.0 ».

1 голос
/ 06 сентября 2010

Самое смешное, что я сделал эту ошибку раньше, так что я должен знать лучше ... но, увы.

Участники ThreadStatic должны быть STATIC.Это действительно должно выдать ошибку компилятора, если это не так ...

0 голосов
/ 28 августа 2012

Нет, согласно ответу Ричарда .

Кроме того, вы должны "делиться" переменными между модулями HTTP через HttpContext.Current.Items.В случае [ThreadStatic] из-за гибкости потока в ASP.NET не гарантируется, что ваш код будет запускаться и заканчиваться в том же потоке.Итак, ThreadStatic не такая уж хорошая идея в ASP.NET.

Стоит сказать, что EndRequest всегда будет выполняться с одним и тем же HttpContext.

Кажется, этоокончательный пост об использовании [ThreadStatic] стихов HttpContext http://piers7.blogspot.co.nz/2005/11/threadstatic-callcontext-and_02.html

Скотт Хансельман также написал на эту тему:
http://www.hanselman.com/blog/ATaleOfTwoTechniquesTheThreadStaticAttributeAndSystemWebHttpContextCurrentItems.aspx

И у Джона Скита тоже есть хороший ответ SO:
CallContext против ThreadStatic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...