2009-08-27 26 views
35

我有一個WCF服務和一個Web應用程序。 Web應用程序以連續的方式調用此WCF服務a.k.a輪詢。在我們的生產環境中,我很少收到此錯誤。因爲,這是用戶不知道何時拋出此錯誤的內部活動。WCF:System.Net.SocketException - 通常只允許使用每個套接字地址(協議/網絡地址/端口)

無法連接到 http://localhost/QAService/Service.svc。 TCP錯誤代碼10048:每個套接字地址 (協議/網絡地址/端口)只有一個用法 是 ,通常允許127.0.0.1:80。 ---> System.Net.WebException:無法連接到遠程服務器 ---> System.Net.Sockets.SocketException: 每個套接字地址 (協議/網絡地址/端口)只有一個用法是 通常允許127.0.0.1:80

我在我們的dev/qa環境中重現此行爲時遇到了問題。我確保客戶端連接在try..catch..finally塊中關閉。仍然不明白是什麼導致這個問題..任何人都知道這一點?

注意:我已經看了這SO question,但似乎沒有回答我的問題,所以它不是重複的問題。

+0

是,因爲Web服務使用端口80,這是在使用IIS?您的服務在生產中使用哪個端口?生產中配置了哪個端口? – shahkalpesh 2009-08-27 06:20:29

+0

這兩個應用程序都是相同的80。 WCF服務被配置爲站點所在的根目錄內的虛擬目錄。 所以,你是說偶爾會有網頁請求和服務請求之間的衝突嘗試使用相同的端口的網頁? – asyncwait 2009-08-27 06:23:58

+0

我遇到過類似的情況。計劃在wcf服務中使用net tcp端口共享功能。 http://msdn.microsoft.com/en-us/library/ms734772.aspx請讓我知道,如果這項工程 – 2010-02-13 11:10:02

回答

59

您正在超載TCP/IP堆棧。 Windows(我認爲實際上所有的套接字堆棧)都對可以按照快速順序打開的套接字數量有限制,這是由於在正常操作下套接字如何關閉。每當套接字關閉時,它會進入TIME_WAIT狀態一段時間(240秒IIRC)。每次輪詢時,一個套接字會被超出默認的動態範圍(我認爲它大約有超過1024個的大約5000個動態端口),並且每次輪詢結束時,該特定的套接字都會進入TIME_WAIT。如果你頻繁輪詢,你最終會消耗所有可用的端口,這將導致TCP錯誤10048.

通常,WCF通過集中連接和類似的東西來避免這個問題。內部服務通常不是通過互聯網進行的。我不確定是否有任何wsHttp綁定支持連接池,但netTcp綁定應該。我會假定命名管道不會遇到這個問題。我不能說MSMQ綁定。

有兩種解決方案可以用來解決此問題。您可以增加動態端口範圍,也可以縮短TIME_WAIT的時間。前者可能是更安全的路線,但是如果您正在消耗極高容量的插座(這聽起來不像您的情況那樣),但減少TIME_WAIT是更好的選擇(或兩者結合在一起)。

更改動態端口範圍

  1. 打開註冊表。
  2. 打開密鑰HKLM \ System \ CurrentControlSet \ Services \ Tcpip \參數
  3. 編輯(或創建爲DWORD)MaxUserPort值。
  4. 將其設置爲更高的數字。 (即65534)

更改TIME_WAIT延遲

  1. 打開註冊表。
  2. 打開鍵HKLM \ System \ CurrentControlSet \ Services \ Tcpip \參數
  3. 編輯(或創建爲DWORD)TcpTimedWaitDelay。
  4. 將其設置爲較小的數字。值以秒爲單位。 (即60分鐘延遲1分鐘)

上述解決方案之一應該可以解決你的問題。如果它在更改端口範圍後仍然存在,我會看到嘗試增加輪詢的週期,以避免頻繁發生......這會給您更多的時間來解決等待延遲的問題。我會改變等待時間作爲最後的手段。

+0

嚴......這個鏈接http://msdn.microsoft.com/en-us/library/aa560610 (v = bts.20).aspx以不同方式表示參數TCPTimeWaitDelay。它將它描述爲TcpTimedWaitDelay。我怎樣才能得到它的確認? 來自technet的更多信息:http://technet.microsoft.com/en-us/library/cc938217.aspx – Jaans 2013-07-09 08:20:04

+0

是適當的套管TcpTimeWaitDelay?如果是這樣,我會解決答案。 – jrista 2016-02-01 23:10:46

+1

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpTimedWaitDelay – granadaCoder 2016-08-25 18:10:43

相關問題