Ich erhalte viele Ausnahmen (~100 pro Stunde?), was dazu führt, dass die Trace-Datei mit der Zeit aufgebläht wird. Ich habe keine Berichte darüber erhalten, dass das System instabil wird, also hat es keine offensichtlichen Auswirkungen auf die Leistung des Dienstes. Der Trace ist immer derselbe:
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)
Bei meinen Nachforschungen habe ich festgestellt, dass dies eine recht häufige Frage ist, und die Antwort scheint in der Regel darin zu bestehen, den Timeout/maxRecievedMessageSize in der Konfigurationsdatei des Dienstes und des Clients zu erhöhen.
Die Konfigurationsdateien sind wie folgt
WCF-Dienst-Konfiguration:
<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>
Client-Konfiguration
<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>
Das scheint ziemlich großzügig zu sein? Ist es immer noch der Fall, dass ich einfach die Zahlen erhöhen muss, oder ist es etwas anderes?