2015-03-31 77 views
0

我有wcf服務(S1)作爲客戶端,另一個Wcf服務(S2)作爲服務器。 S1通過net.tcp消耗S2。 S2有一個操作,它返回一個複雜的對象,其大部分內容都是字符串。該對象的平均大小在7-8 MB之間。WCF服務 - 消息/對象大小相關

最近我不得不添加更多的字符串內容到實際的對象圖。這導致S2返回以下錯誤

套接字連接被中止。這可能是由於處理您的消息的錯誤 或遠程主機的 接收超時或基礎網絡資源問題所致。本地套接字 超時時間爲'00:05:00'。 System.Net.Sockets.SocketException (0x80004005):現有連接被System.Net.Sockets.Socket.Receive(Byte []緩衝區,Int32 偏移量,Int32大小,SocketFlags socketFlags)上的遠程 主機強制關閉 System.ServiceModel.Channels.SocketConnection.ReadCore(字節[]緩衝液, 的Int32偏移的Int32大小,時間跨度超時,布爾閉合)

然而,一切都按預期,當我從刪除一些的字符串內容對象圖。

在做了一點家庭作業後,我得到了一個結論,它與返回的對象的大小有關。這使我修改了我的客戶端和服務配置/配額。

但是,即使修改客戶端和服務特別是大小相關的屬性後,我仍然沒有運氣。

有人可以指導我嗎?如有需要,請向我諮詢更多信息。

在此先感謝。

客戶端(S1)

<netTcpBinding> 
     <binding name="NetTcp" closeTimeout="00:05:00" 
      openTimeout="00:05:00" receiveTimeout="00:10:00" sendTimeout="00:05:00" 
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="2147483647" 
      maxBufferSize="2147483647" maxConnections="10" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
      enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    <client> 
      <endpoint address="net.tcp://xxxxxxxx/xxxxxxService" 
      binding="netTcpBinding" bindingConfiguration="NetTcp" behaviorConfiguration="RBehavior" 
      contract="IService" name="NetTcp" /> 
     </client> 
     <services/> 

     <behaviors> 
      <serviceBehaviors> 
      <behavior name="NSBehavior"> 
       <etwTracking profileName="EndToEndMonitoringProfile"/> 
       <serviceMetadata httpGetEnabled="false"/> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 

      </serviceBehaviors> 
     <endpointBehaviors>         
       <behavior name="RBehavior"> 
    **<dataContractSerializer maxItemsInObjectGraph="2147483647" />** 
       </behavior> 
      </endpointBehaviors> 
     </behaviors> 

     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
     </system.serviceModel> 

    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true"/> 
     </system.webServer> 

服務器(S2)

<system.serviceModel> 
    <bindings> 
     <netTcpBinding> 
     <binding name="netTcp" closeTimeout="00:03:00" 
      openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00" 
      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions" 
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="20000000" 
      maxBufferSize="20000000" maxConnections="10" maxReceivedMessageSize="20000000"> 
      <readerQuotas maxDepth="32" maxStringContentLength="20000000" 
      maxArrayLength="20000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
      enabled="false" /> 
      <security mode="None"> 
      <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     </netTcpBinding> 
    </bindings> 

    <services> 
     <service name="Engine.Rules" 
       behaviorConfiguration="REServiceBehavior"> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://xxxxx:8005/Service"/> 
      </baseAddresses> 
     </host> 
     <endpoint address="" 
        binding="netTcpBinding" bindingConfiguration="netTcp" 
        contract="Ixxxx" /> 
     <endpoint address="mex" 
        binding="mexTcpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="REServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false"/> 
     **<dataContractSerializer maxItemsInObjectGraph="2147483647"/>** 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <serviceThrottling maxConcurrentSessions="1000"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

更新:按照@ ErikFunkenbusch的合理支持,我附上服務跟蹤信息。 Exception

<ExceptionString>System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was '00:05:00'. ---&gt; System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing) 
    --- End of inner exception stack trace ---</ExceptionString> 
<InnerException> 
<ExceptionType>System.Net.Sockets.SocketException, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
<Message>An existing connection was forcibly closed by the remote host</Message> 
<StackTrace> 
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing) 
</StackTrace> 
<ExceptionString>System.Net.Sockets.SocketException (0x80004005): An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] buffer, Int32 offset, Int32 size, TimeSpan timeout, Boolean closing)</ExceptionString> 
<NativeErrorCode>2746</NativeErrorCode> 
</InnerException> 
</Exception> 
+2

而不是隻是隨機設置的東西,你爲什麼不只是在服務器上啓用消息跟蹤,然後看看跟蹤日誌,看看哪些值需要增加? – 2015-03-31 21:51:11

+0

我無法爲這些個人服務設置跟蹤。任何建議如何設置net.tcp綁定? – Nair 2015-03-31 21:54:56

+0

你是什麼意思的「不幸」?跟蹤非常簡單,對於所有WCF服務而言都是一樣的,無論運輸是什麼。 https://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx – 2015-03-31 22:03:24

回答

0

您是否嘗試過增加發送和接收超時值?您通過網絡發送大量數據(7-8MB),並且5秒可能沒有足夠的時間來完成該事務。嘗試將它們設置爲30秒,然後從那裏開始工作。

E:

<binding name="netTcp" closeTimeout="00:30:00" 
     openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"> 

這就是我指的是,具體。

+0

它是5和3分鐘。 – Nair 2015-03-31 21:56:43