2010-07-26 63 views
1

我有一個ASP.NET Web窗體應用程序,它在內部對Web服務進行了許多SOAP和REST調用。 SOAP調用使用微軟自己的「包裝」代碼。 REST調用來自一個簡單的REST客戶端。該客戶端使用Using塊來處理任何資源。WebRequest和資源 - ASP.NET超時

該應用程序運行良好幾個小時,但然後掛斷。該網站將不再能夠提供asp.net頁面。我通過在上面放置了一個hello.htm文件來測試這個站點......它服務的很好。所以這絕對是ASP.NET引擎空間中的一個問題。

感覺就像它已經用完了池中的webrequests。我可以走了。我可以嘗試什麼?我應該看什麼?需要數小時才能完成問題重現。 在IIS上重新啓動站點可以解決問題,但是cource不是我們可以接受的修復。

啓動錯誤和堆棧跟蹤:
'/'應用程序中的服務器錯誤。

該操作已超時 描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息:System.Net.WebException:操作已超時

源錯誤:在當前web請求的執行過程中生成 未處理的異常。關於異常的來源和位置的信息可以使用下面的異常堆棧跟蹤來標識。

堆棧跟蹤: [引發WebException:操作已超時] System.Net.HttpWebRequest.GetRequestStream()5322142 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(字符串方法名,對象[]參數) +103

UPDATE等詳細信息
的自產自銷的REST調用和SOAP都做同步。
他們並不長壽,他們需要約1秒。
Web服務託管在同一個數據中心內的Tomcat服務器(不同機器)上。
.NET應用程序在Tomcat服務器上調用SOAP和REST服務。

該應用程序以某種方式在大約停留一小時之後自行修復。思考? 如何監視.NET Threadpool? DefaultConnectionLimit會影響自發出站連接嗎?

解決方案 看到答案補充意見和...... 1)關閉所有流和反應/從自產自銷的REST代碼請求(哎呀)
2)System.Net.ServicePointManager.DefaultConnectionLimit = 96;
//默認值= 12次內核數量
System.Net.ServicePointManager。MaxServicePointIdleTime = 3000;
//默認= 100000(100秒),
通過固定的任何滲漏代碼和超時的空閒時間更快的一切似乎

+0

您對外部SOAP服務有任何使用限制嗎?追蹤它所調用的服務,看看您是否可以在練習中多次擊中它。所有頁面都會調用同一個服務嗎?所有的SOAP調用都會失敗還是隻有這個? – 2010-07-26 19:52:30

+0

我可以使用WinForms客戶端和另一個ASP.NET Web應用程序(同一個IIS)從同一個盒子中找到它。所有從此IIS站點調用REST或SOAP超時。應用程序日誌將其列爲WebException超時 – BuddyJoe 2010-07-26 20:02:09

+0

如何檢查此應用程序佔用了多少內存?我還不熟悉導航IIS 7或win2008 – BuddyJoe 2010-07-26 20:05:02

回答

3

1)您是否使用異步WebRequests好工作呢? 2)您的Web服務調用是否已經過很長時間(意思是需要很長時間才能完成?) 3)Web服務在哪裏託管?它在同一臺機器上嗎? 4)REST服務託管在哪裏?與asp.net應用程序相同的機器還是不同?

當請求進入ASP.NEt服務器時,它將在線程池線程上處理。我不確定這是一個完成端口線程還是線程池線程。

無論如何,您的應用程序正在線程池線程上調用。在此線程上,您正在發出HTTPWebRequest(HWR)。如果這個請求是同步的,它不應該使用任何額外的線程。但是,如果它是異步的,它將從池中取出另一個線程來完成。

現在,如果您所做的HWR返回到同一臺服務器,並且該請求需要另一個線程在同一臺服務器上完成,那麼您現在需要多一個線程。將此與Webservice結合需要很長時間,並且每個請求佔用至少2(最多3個)線程。如果您向asp.net服務器發出大量請求,服務器可能會很快達到最大線程池線程限制。

到目前爲止,我假設代碼中沒有邏輯錯誤,並且正在正確處置HttpWebResponse對象。

因此,當沒有線程完成工作時,您的HttpWebRequest可能會引發超時異常。

如果您的後端Web服務調用屬於同一臺機器,並且您尚未將ServicePointManager.DefaultConnectionLimit增加到您的方案的合理值,也可能發生這種情況。例如,如果您的asp.net應用程序預計會有200個同時發生的請求,您應該設置DefaultConnectionLimit = 200 +一些合理的緩衝區。連接池中缺乏連接也會導致這種情況。

解決方案:

我先起來DefaultConnectionLimit。如果這不能解決它,那麼你將需要監視ASP.NET性能計數器,並查看.Net線程池是否正在耗盡,這可能會導致web請求失敗。

+0

感謝您的幫助。請參閱原始問題中的UPDATE。 +1 – BuddyJoe 2010-07-27 13:50:10

+1

是的,DefaultConnectionLimit會影響從您的應用程序啓動的出站連接。作爲第一個測試,我會嘗試增加,看看它是否能解決您的問題。 用於監測線程數量,您可以看到性能計數器 。NET CLR鎖和線程/當前物理線程的數量 作爲線程池中#個線程的代理。 您還可以跟蹤asp.net性能計數器跟蹤請求排隊/請求執行等 – feroze 2010-07-28 20:30:17

+0

在這一個被稱爲微軟的支持和這兩個設置是關鍵 - http://stackoverflow.com/questions/3363183 – BuddyJoe 2010-07-30 13:09:25