WCF套接字连接中止填写跟踪文件

时间:2011-07-29 10:43:27

标签: wcf exception logging trace

我遇到很多异常(每小时约100个?),导致跟踪文件随着时间推移而变得臃肿。没有任何关于系统变得不稳定的报告,因此它不会直接影响服务的性能。跟踪总是一样的:

Information - Aborted 'System.ServiceModel.Channels.ServiceChannel/32909893'

Information - Aborted 'System.ServiceModel.Channels.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel/12895634'

Warning - SocketConnection aborted

Error - Throwing an exception
Message: 
A TCP error (995: The I/O operation has been aborted because of either a thread exit or an application request) occurred while transmitting data.
Stack Trace:
System.ServiceModel.Channels.SocketConnection.EndRead()
System.ServiceModel.Channels.DelegatingConnection.EndRead()
System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
System.ServiceModel.Channels.SocketConnection.FinishRead()
System.ServiceModel.Channels.SocketConnection.AsyncReadCallback(Boolean haveResult, Int32 error, Int32 bytesRead)
System.ServiceModel.Channels.OverlappedContext.CompleteCallback(UInt32 error, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
System.ServiceModel.Diagnostics.Utility.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Error - Throwing an exception
Message:
A TCP error (995: The I/O operation has been aborted because of either a thread exit or an application request) occurred while transmitting data.
Stack Trace:
System.ServiceModel.Channels.SocketConnection.EndRead()
System.ServiceModel.Channels.DelegatingConnection.EndRead()
System.ServiceModel.Channels.SessionConnectionReader.OnAsyncReadComplete(Object state)
Error - Throwing an exception
Message:
A TCP error (995: The I/O operation has been aborted because of either a thread exit or an application request) occurred while transmitting data.
Stack Trace:
System.ServiceModel.Channels.SessionConnectionReader.GetPendingMessage()
System.ServiceModel.Channels.SessionConnectionReader.EndReceive()
System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsyncResult.OnReceiveComplete(Object state)

Error - Throwing an exception
Message:
A TCP error (995: The I/O operation has been aborted because of either a thread exit or an application request) occurred while transmitting data.
Stack Trace:
System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
System.ServiceModel.Channels.FramingDuplexSessionChannel.EndReceive(IAsyncResult result)
System.ServiceModel.Channels.FramingDuplexSessionChannel.TryReceiveAsyncResult.CompleteReceive(IAsyncResult result)
System.ServiceModel.Channels.FramingDuplexSessionChannel.TryReceiveAsyncResult.OnReceive(IAsyncResult result)

在我的研究中,我发现这是一个相当常见的问题,似乎答案通常是在服务和客户端的配置文件中增加timeout / maxRecievedMessageSize。

配置文件如下

WCF服务配置:

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="customNetTcpBinding" maxReceivedMessageSize="10485760" maxBufferPoolSize="10485760" maxBufferSize="10485760">
      <security mode="None" />
  <readerQuotas maxStringContentLength="10485760"/> 
    </binding>
  </netTcpBinding>
</bindings>
<diagnostics>
  <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
  <service behaviorConfiguration="WcfServiceLibrary.ServiceBehavior"
    name="xxx.xxx.xxx">
    <endpoint address="Endpoint" binding="netTcpBinding" bindingConfiguration="customNetTcpBinding"
      name="netTcpBinding" contract="xxx.xxx.xxx">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
      name="mexTcpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="xxx.xxx.xxx" />
      </baseAddresses>
    </host>
  </service>
    <service behaviorConfiguration="WcfServiceLibrary.ServiceBehavior"
        name="xxx.xxx.xxx">
        <endpoint address="EndPoint" binding="netTcpBinding" bindingConfiguration="customNetTcpBinding"
            name="netTcpBinding" contract="xxx.xxx.xxx" listenUriMode="Explicit">
            <identity>
                <dns value="localhost" />
            </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
            name="mexTcpBinding" contract="IMetadataExchange" />
        <host>
            <baseAddresses>
                <add baseAddress="xxx.xxx.xxx" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="WcfServiceLibrary.ServiceBehavior">
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
      <serviceDebug httpHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
      <serviceThrottling maxConcurrentCalls="16"
                         maxConcurrentInstances="2147483647"
                         maxConcurrentSessions="64"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

客户端配置

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="xxxx" 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="524288"
      maxBufferSize="10485760" maxConnections="10" maxReceivedMessageSize="10485760">
      <readerQuotas maxDepth="32" maxStringContentLength="10485760"
        maxArrayLength="16384" 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>
    <binding name="xxxx" closeTimeout="00:05:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:05:00" transactionFlow="false"
      transferMode="Buffered" transactionProtocol="OleTransactions"
      hostNameComparisonMode="StrongWildcard" listenBacklog="10" maxBufferPoolSize="524288"
      maxBufferSize="10485760" maxConnections="10" maxReceivedMessageSize="10485760">
      <readerQuotas maxDepth="32" maxStringContentLength="10485760"
        maxArrayLength="16384" 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>
<client>
  <endpoint address="xxx.xxx.xxx" binding="netTcpBinding"
    bindingConfiguration="xxxx" contract="xxx.xxx.xxx"
    name="xxxx">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="xxx.xxx.xxx" binding="netTcpBinding"
    bindingConfiguration="xxxx" contract="xxx.xxx.xxx"
    name="xxxx">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>

这看起来相当慷慨?是否仍然需要增加数字或是其他什么呢?

1 个答案:

答案 0 :(得分:1)

这些错误是否可能是由网络上的数据包丢失引起的?

我从配置文件中看到您正在使用启用了可靠会话的绑定。这意味着如果服务器未收到客户端收到消息的确认,则将自动重新发送网络丢失的任何消息。这可以解释为什么您没有看到您的服务中断;记录失败,然后服务器重新成功重新发送。

如果您想测试这确实是问题,请尝试在配置文件中关闭可靠会话。您需要在客户端和服务器配置文件中指定此显式(作为绑定定义的一部分),因为我认为默认情况下netTCP绑定会执行此操作。

 <reliableSession enabled="false" />

如果以上不是您可以尝试的选项,那么您可以让网络管理员进行跟踪并查看是否存在数据包丢失。

我希望这会有所帮助:)