Sie erhalten eine SocketException bei Verwendung von WCF-Verbindungspooling
In diesem Artikel wird SocketException beschrieben, wann Windows WCF-Anwendung (Communication Foundation) Verbindungspooling verwendet.
Ursprüngliche Produktversion: Windows Communication Foundation
Ursprüngliche KB-Nummer: 2607014
Zusammenfassung
Bei einer WCF-Anwendung, die Verbindungspooling verwendet, können Socketausnahmen auftreten, wenn Verbindungen an den Verbindungspool zurückgegeben werden. Wenn Sie die WCF-Ablaufverfolgung aktivieren, wird ein Ähnliches Ereignis wie das folgende angezeigt:
<TraceRecord xmlns="[https://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord](https://schemas.microsoft.com/2004/10/e2etraceevent/tracerecord)" Severity="Information">
<TraceIdentifier>http://msdn.microsoft.com/en-US/library/System.ServiceModel.Channels.ConnectionPoolIdleTimeoutReached.aspx</TraceIdentifier>
<Description>A connection has exceeded the idle timeout of this connection pool (00:02:00) and been closed.</Description>
<AppDomain>/LM/W3SVC/1/ROOT/QSPolicy-1-129558237523483320</AppDomain>
<Source>System.ServiceModel.Channels.IdlingCommunicationPool`2+IdleTimeoutEndpointConnectionPool+IdleTimeoutIdleConnectionPool[System.String,System.ServiceModel.Channels.IConnection]/5317080</Source>
</TraceRecord>
Weitere Informationen
Wenn ein WCF-Client versucht, eine neue Verbindung zu öffnen, versucht der System.ServiceModel Code, eine Verbindung aus dem Verbindungspool abzurufen. In einigen Fällen ist für die Verbindung mit dem Verbindungspool möglicherweise ein Timeout aufgetreten. Ein ordnungsgemäßes Beenden wird versucht, indem versucht wird, aus der Verbindung zu lesen. Wenn für die WCF-Serververbindung ein Timeout aufgetreten ist und die Verbindung zurückgesetzt wird, wird beim Versuch des WCF-Clients, von der Verbindung zu lesen, ein Fehler angezeigt, und ein SocketException Fehler wird ausgelöst. Dies SocketException wird im Code ausgelöst und vom Code Sytem.Net System.ServiceModel verarbeitet. Die Clientverbindung wird dann geschlossen. Da diese Ausnahme im Code behandelt wird System.ServiceModel und nicht erneut in Anwendungscode zurückverbreitet wird, kann diese Ausnahme ignoriert werden.
Wenn Sie beim Auslösen des Aufrufs einen Debugger anfügen und unterbrechen, erhalten Sie einen verwalteten Aufrufstapel ähnlich wie den folgenden:
0:040> !clrstack OS Thread Id: 0x16a8 (40) ESP EIP 1df4dc98 76e1c83b [HelperMethodFrame: 1df4dc98] 1df4dd3c 6de87ada System.Net.Sockets.Socket.BeginReceive(Byte[], Int32, Int32, System.Net.Sockets.SocketFlags, System.AsyncCallback, System.Object) 1df4dd68 6986ea7e System.ServiceModel.Channels.SocketConnection.BeginReadCore(Int32, Int32, System.TimeSpan, System.Threading.WaitCallback, System.Object) 1df4dde0 6986de7d System.ServiceModel.Channels.SocketConnection.CloseAsyncAndListen() 1df4de2c 6986eea4 System.ServiceModel.Channels.SocketConnection.Close(System.TimeSpan, Boolean) 1df4de84 6984e721 System.ServiceModel.Channels.BufferedConnection.Close(System.TimeSpan, Boolean) 1df4dec4 69855cb8 System.ServiceModel.Channels.ConnectionPool.CloseItemAsync(System.ServiceModel.Channels.IConnection, System.TimeSpan) 1df4ded4 697f0be8 System.ServiceModel.Channels.IdlingCommunicationPool
2+IdleTimeoutEndpointConnectionPool[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].CloseItemAsync(System.__Canon, System.TimeSpan) 1df4def0 697f095c System.ServiceModel.Channels.CommunicationPool2+EndpointConnectionPool[[System.__Canon, mscorlib],[System.__Canon, mscorlib]]. CloseIdleConnection(System.__Canon, System.TimeSpan) 1df4df34 69c44dddd System.ServiceModel.Channels.CommunicationPool'2+EndpointConnectionPool[[System.__Canon, mscorlib],[System.__Canon, mscorlib]]. TakeConnection(System.TimeSpan) 1df4dfa0 6918280b System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(System.TimeSpan) 1df4e054 69182607 System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(System.TimeSpan) 1df4e098 690f1c16 System.ServiceModel.Channels.CommunicationObject.Open(System.TimeSpan) 1df4e0dc 691923f2 System.ServiceModel.Channels.ServiceChannel.OnOpen(System.TimeSpan) 1df4e0f0 690f1c16 System.ServiceModel.Channels.CommunicationObject.Open(System.TimeSpan) 1df4e134 690f1af2 System.ServiceModel.Channels.CommunicationObject.Open()