我遇到很多异常(每小时约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>
这看起来相当慷慨?是否仍然需要增加数字或是其他什么呢?
答案 0 :(得分:1)
这些错误是否可能是由网络上的数据包丢失引起的?
我从配置文件中看到您正在使用启用了可靠会话的绑定。这意味着如果服务器未收到客户端收到消息的确认,则将自动重新发送网络丢失的任何消息。这可以解释为什么您没有看到您的服务中断;记录失败,然后服务器重新成功重新发送。
如果您想测试这确实是问题,请尝试在配置文件中关闭可靠会话。您需要在客户端和服务器配置文件中指定此显式(作为绑定定义的一部分),因为我认为默认情况下netTCP绑定会执行此操作。
<reliableSession enabled="false" />
如果以上不是您可以尝试的选项,那么您可以让网络管理员进行跟踪并查看是否存在数据包丢失。
我希望这会有所帮助:)