【问题标题】:WCF Service - Message / Object size relatedWCF 服务 - 消息/对象大小相关
【发布时间】:2015-03-31 21:43:56
【问题描述】:

我有 wcf 服务 (S1) 作为客户端和另一个 Wcf 服务(S2) 作为服务器。 S1 通过 net.tcp 消耗 S2。 S2 有一个操作,它返回一个复杂的对象,它的大部分内容都是字符串。此对象的平均大小在 7-8 MB 之间。

最近我不得不在实际的对象图中添加更多的字符串内容。这会导致 S2 返回以下错误

套接字连接被中止。这可能是由错误引起的 处理您的消息或接收超时被超过 远程主机或底层网络资源问题。本地插座 超时为“00:05:00”。 System.Net.Sockets.SocketException (0x80004005): 现有连接被远程强行关闭 主机在 System.Net.Sockets.Socket.Receive(Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags socketFlags)在 System.ServiceModel.Channels.SocketConnection.ReadCore(Byte[] 缓冲区, Int32 偏移量、Int32 大小、TimeSpan 超时、布尔关闭)

但是,当我从对象图中删除一些字符串内容时,一切都按预期工作。

做了一些功课后,我终于得出一个结论,它与返回对象的大小有关。这让我不得不修改我的客户端和服务配置/配额。

但是,即使修改了客户端和服务,尤其是与大小相关的属性,我也没有运气。

有人可以指导我吗?如果需要,请向我询问更多信息。

提前致谢。

客户端 (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 的明智支持,我附上服务跟踪信息。

<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>

【问题讨论】:

  • 与其随机设置,不如直接在服务器上开启消息跟踪,然后查看跟踪日志,看看需要增加哪个值?
  • 我无法为这些单独的服务设置跟踪。有关如何为 net.tcp 绑定设置此设置的任何建议?
  • “没有运气”是什么意思?跟踪非常简单,并且无论传输如何,所有 WCF 服务的工作方式都相同。 msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx
  • @ErikFunkenbusch,感谢您的链接。我确实启用了跟踪。没有记录任何痕迹。此外,S2 是使用 Windows 服务托管的 wcf,而 S1 是托管在 IIS 中的 wcf。
  • 不管它是否由 Windows 服务托管。您确实需要确保它将日志写入服务有权写入的位置。

标签: c# .net wcf wcf-binding wcf-configuration


【解决方案1】:

您是否尝试过增加发送和接收超时值?您正在通过网络 (7-8MB) 发送大量数据,而 5 秒可能不足以完成该事务。尝试将它们设置为 30 秒,然后从那里开始工作。

E:

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

这就是我所指的,具体来说。

【讨论】:

  • 现在是 5 和 3 分钟。
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 2010-09-27
  • 1970-01-01
  • 2020-10-06
  • 1970-01-01
  • 2014-02-01
  • 2014-10-23
  • 2012-11-17
相关资源
最近更新 更多