2010-12-17 69 views
2

我正在調試在.NET 4.0(Windows 7)上運行的ASP.NET MVC 2應用程序,當前在Cassini中,Visual Studio調試Web服務器。Cassini(VS WebDev)在不同的線程上執行BeginRequest和EndRequest

所有運行良好,當我突然在我的Application.EndRequest處理程序中有異常。在調查了這個問題之後,我發現原因是Cassini在與BeginRequest不同的線程上調用EndRequest(然後,在BeginRequest中設置並在EndRequest處理程序中使用的ThreadStatic變量爲null,因爲在此線程上,BeginRequest永遠不會所謂的)。

卡西尼在不同線程上執行BeginRequest和EndRequest的原因是什麼?

我知道原因可能是'Async'Page指令(請參閱Do ASP.NET Requests always BeginRequest and EndRequest on the same thread?,但我的Page指令中沒有'Async'屬性)。

必須有另一個原因。

謝謝!

回答

5

ASP.NET一般是thread-agile。您不應該假設整個請求將在一個線程中處理。使用HTTP上下文而不是線程靜態變量。

雖然只有某些地方線程可以在請求處理期間切換,但避免做出任何假設IMO是個好主意。