簡體   English   中英

WCF Windows服務TimeOut

[英]WCF Windows Service TimeOut

我有一個在.net中開發的客戶端應用程序向wcf服務發送請求並且應該發送響應。如果執行時間在1分鍾內,則沒有錯誤,如果超過1分鍾則錯誤是

內部異常:發送到net.tcp:// localhost:18001 / PitToPort / 2008/01/30 / StockpileService / tcp的請求操作未在配置的超時(00:01:00)內收到回復。
分配給此操作的時間可能是較長超時的一部分。 這可能是因為服務仍在處理操作,或者因為服務無法發送回復消息。 請考慮增加操作超時(通過將通道/代理強制轉換為IContextChannel並設置OperationTimeout屬性)並確保該服務能夠連接到客戶端

如何增加時間以及如何? 什么是最好的解決方案?

注意,這個錯誤消息是WCF發送的樣板字符串,當它不知道發生了什么。 這真的意味着“mmh鏈條出了問題,但我不確定是什么,所以,這里有一些關於配置的瑣事,做你想做的事情”。

大多數時候,當你收到這條消息時,它與實際的超時無關。 它可以是配額(圖中的對象數,總大小,數組長度)或服務器端出錯的東西,在服務方法返回結果和實際字節通過網絡發送之間。 所以,你應該檢查你的配置設置(而不是超時,除非你必須等待一分鍾才能得到錯誤。如果你馬上得到錯誤,它與任何超時無關)。

這個無用的消息是我的WCF煩惱列表之上。

超時稱為“sendTimeout”,您可以在配置文件的綁定部分或代碼中配置它 - 您的選擇。

配置:

  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding sendTimeout="00:03:00" />
      </netTcpBinding>
    </bindings>

這會將超時設置為3分鍾。

我已將以下代碼添加到服務應用程序代碼中

system.transactions  
    defaultSettings timeout="00:30:00" 

使用此代碼,服務將等待30分鍾,以便在數據庫服務器中完成進程並增加

maxBufferSize="2147483647"  
maxReceivedMessageSize="2147483647"  
maxBufferPoolSize="2147483647" 

在客戶端綁定屬性,然后它工作正常。

問題:服務正在發送響應,但客戶端緩沖區大小較少,我增加到最大緩沖區大小。

我遇到了同樣的錯誤。 具體來說,我收到的例外是:

System.ServiceModel.CommunicationException:套接字連接已中止。 這可能是由於處理消息的錯誤或遠程主機超出接收超時或基礎網絡資源問題引起的。 本地套接字超時為'00:09:59.9940000'。

System.IO.IOException:寫入操作失敗,請參閱內部異常。

System.ServiceModel.CommunicationException:套接字連接已中止。

這可能是由於處理消息的錯誤或遠程主機超出接收超時或基礎網絡資源問題引起的。

本地套接字超時為'00:09:59.9940000'。

System.Net.Sockets.SocketException:遠程主機強制關閉現有連接

我的問題的原因是由於我的WCF客戶端發送到WCF主機的消息的大小。 顯然,消息的大小太大了。

為解決此問題,我將主機Web.Config maxReceivedMessageSize屬性從2097152更改為8000000 ,錯誤不再保留。

這是我所指的Web.Config的屬性:

<netTcpBinding>
<binding name="NetTCPBinding" maxReceivedMessageSize="8000000">
....
</binding>
</netTcpBinding>

我選擇的8M消息大小取決於我“認為”消息大小的大小。 我不知道如何明確確定從客戶端傳遞到主機的實際WCF消息的大小。

檢查一下,對於類似類型的錯誤,你必須設置OperationTine屬性http://www.codeproject.com/KB/WCF/WCF_Operation_Timeout_.aspx

如果您知道服務器為什么花了一分多鍾來響應客戶端,那么您應該擴展通道的OperationTimeout(如錯誤消息中所述)。

看看這個,包括最后的代碼示例: http//final-proj.blogspot.com/2009/09/wcf-timeouts.html

祝好運。

這是一個更簡單的解決方案......只需在當前的ClientBase上直接設置屬性即可。 換句話說,首先添加一個服務引用,初始化它,然后設置屬性“InnerChannel.OperationTimeout”

NetUtilsWCF.SMTPDiagClient sClient = new NetUtilsWCF.SMTPDiagClient();

sClient.InnerChannel.OperationTimeout = new TimeSpan(0,5,0);

我在使用回調時遇到了同樣的異常。它在本地測試中工作(客戶端和服務程序在同一台機器上運行)但在用戶環境中不起作用(服務程序在winserver 2008中運行)。 服務器代碼已根據日志執行。我認為這是因為環境或權限問題,但不知道如何處理。

如果在更正配置文件后遇到問題,則可能需要檢查此屬性。 "OperationContract(IsOneWay:=True)". 如果您錯過了IsOneWay:=True屬性,則可能會導致此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM