2012-04-12 37 views
6

我正在處理兩個應用程序,其中一個具有一個自我託管的服務,該服務被配置爲使用net.tcp綁定。該服務的ServiceBehaviorAttribute配置有:WCF:EndpointNotFoundException運行幾秒後

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
       InstanceContextMode = InstanceContextMode.Single, 
       IncludeExceptionDetailInFaults = true, 
       UseSynchronizationContext = false, 
       ValidateMustUnderstand = false)] 

對於這兩種,服務和客戶端的transferMode被設置爲流式傳輸,並且超時是:

closeTimeout="00:01:00" 
openTimeout="00:00:30" 
receiveTimeout="00:02:30" 
sendTimeout="00:02:30" 

MaxConnections最大被設置爲500和ServiceThrottlingBehavior用途的WCF 4的默認值:

  • MaxConcurrentSessions:100 * ProcessorCount
  • MaxConcurrent調用:16 * ProcessorCount
  • MaxConcurrentInstances:default是上述兩項的總和,它們遵循與之前相同的模式。

我正在使用四核計算機並啓用了Net.Tcp端口共享服務。

客戶端應用程序具有使用ChannelFactory類創建的服務的單個通道。一旦通道創建了100個線程。每個線程使用該通道以每秒一條消息的頻率向服務器發送消息。

幾秒鐘運行確定後(客戶端將消息發送到服務器的它正確地接收它們)的EndpointNotFoundException拋出以下消息:

Could not connect to net.tcp://localhost/service. The connection attempt lasted 
for a time span of 00:00:02.1777100. TCP error code 10061: No connection could 
be made because the target machine actively refused it 127.0.0.1:808. 

怪異的事情是:

  • 如果我在同一臺機器上運行這兩個應用程序,異常的時間跨度約爲2秒,但是如果我在我的機器上運行服務器應用程序,而在另一臺機器上運行客戶端應用程序,則異常的時間跨度總是爲1秒。
  • 有些時候(比如十分之一)異常不會拋出,兩個應用程序都可以正常工作。
  • 在拋出異常之前,服務器接收消息並正確處理它們。服務器中不會​​引發異常。

我做了大量的測試,減少線程數量,增加它,改變關閉,打開,接收和發送超時值到更低和更高的值,爲maxConnections設置更高的值,但結果始終是同樣,在某個時候EndpointNotFoundException被拋出。我即將放棄並更改代碼,以便每個線程都有自己的頻道,希望能夠解決這個問題,但我想知道爲什麼會發生這種情況。如果有人知道我做錯了什麼,或者可以指向正確的方向繼續調查,那將會很有幫助。

+0

什麼是這兩個應用程序的端口:

<system.serviceModel> <bindings> <netTcpBinding name="portSharingBinding" portSharingEnabled="true" /> <services> <service name="MyService"> <endpoint address="net.tcp://localhost/MyService" binding="netTcpBinding" contract="IMyService" bindingConfiguration="portSharingBinding" /> </service> </services> </system.serviceModel> 

來自?您是否嘗試過[運行跟蹤](http://stackoverflow.com/a/9897291/151445),或者檢查了端口預留?您還可以運行[tcpview](http://technet.microsoft.com/en-us/sysinternals/bb897437)並監視這兩個應用程序的tcp連接。 – 2012-04-12 14:48:57

+0

用於這兩個應用程序的端口是默認的net.tcp端口,808.我將嘗試tcpview應用程序來監視連接,謝謝! – Diego 2012-04-12 14:55:22

+0

默認情況下,Windows不啓用端口共享。我會檢查你是否啓用了它([見這裏](http://msdn.microsoft.com/en-us/library/ms734772.aspx))。如果可能的話,你也可以嘗試改變一個應用程序的端口,或者在一個虛擬機中測試一個。 – 2012-04-12 15:28:15

回答

1

默認情況下,Windows不啓用端口共享。我會檢查你是否啓用了它(see here)。

如果可能的話,您也可以嘗試更改一個應用程序的端口,或者在一個虛擬機中測試一個應用程序的端口。

此外,對於可能有相同問題的其他人,按照Diego的說法進行操作,並檢查配置中是否啓用了端口共享。添加portSharingEnabled="true"的結合:http://msdn.microsoft.com/en-us/library/ms731810.aspx