我在.NET 4中實現了我的第一個REST服務,並且遇到了意想不到的情況。似乎我不明白微軟ServiceModel的基本工作原理,但無法以傳統方式找到答案。在.NET REST服務實現中使用線程池
要實現我的web服務,我按照這個教程的步驟:http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx
的服務工作。令我驚訝的是Global.asax中的Application_BeginRequest和Application_EndRequest被不同的線程調用。看看堆棧跟蹤,看起來這些線程基於某種線程池。
沒有做一些重構,這是我們的一個問題,因爲我們總是假設一個請求總是在同一線程上運行,由於它我們保管存儲在線程本地存儲一些變量。這些變量在Application_BeginRequest中初始化並在Application_EndRequest中發佈。看來,使用ServiceModel這不是正確的方法。
我的問題是:
- 我可以做任何假設哪些線程正在運行我的代碼,當我使用ServiceModel?
- 有什麼辦法可以將執行限制到單個線程嗎?這會因爲什麼原因而變壞?
- 使用ServiceModel時,在請求期間存儲變量的正確方法是什麼?
謝謝。
更新,對最初的問題。它的一個線程調用Application_BeginRequest,另一個線程運行服務代碼並執行Application_EndRequest。改變ServiceBehavior params沒有做任何事情。任何幫助將非常感激。 – Alex 2011-01-05 22:33:14
聽起來像你正在使用asp.net兼容性的東西,或嘗試。你嘗試過實現你的東西作爲消息調度,或任何其他wcf擴展點(而不是使用asp.net)? – sisve 2011-01-06 00:19:16
@Simon Svensson我正在關注微軟的教程http://blogs.msdn.com/b/endpoint/archive/2010/01/06/introducing-wcf-webhttp-services-in-net-4.aspx。這似乎確實使用了asp.net兼容性。如果使用其他方法,會有什麼不同?有沒有一個我可以閱讀的好地方?謝謝! – Alex 2011-01-06 01:22:00