2011-07-29 30 views
2

我收到了许多异常(〜100每小时?),导致跟踪文件随着时间的推移变得臃肿。没有任何关于系统变得不稳定的报告,所以它不会显着影响服务的性能。跟踪始终是相同的:WCF套接字连接中止填满跟踪文件

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) 

在我的研究,我发现这是一个相当普遍的问题,它似乎和答案通常是为了增加超时/ 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> 

这似乎fairl y慷慨吗?还是这样,我只需要增加数字或者是其他的东西?

+0

找到解决方案?请告诉我们 – user758977

回答

1

这些错误可能是由网络丢包引起的吗?

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

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

<reliableSession enabled="false" /> 

如果上面是不是一种选择,你可以尝试,那么你可以问你的网络管理员做跟踪,并查看是否有丢包。

我希望这有助于:)