-
Notifications
You must be signed in to change notification settings - Fork 571
Description
Describe the bug
When WCF service unexpectedly closes a WebSocket connection, WCF client throws WebSocketException.
System.Net.WebSockets.WebSocketException : The remote party closed the WebSocket connection without completing the close handshake.
To Reproduce
Steps to reproduce the behavior:
- Start SelfHostedCoreWCF service
- Run any WebSocket test on Linux such as WebSocket_Http_RequestReply_Streamed
- Close the connection from service side.
The client throws System.Net.WebSockets.WebSocketException.
Expected behavior
When the service unexpectedly closes a WebSocket connection, the client is expected to throw CommunicationException instead of WebSocketException.
To workaround the bug, we provide a temporary fix and catch WebSocketException while closing the channel factory objects. See PR: #5802
catch (System.Net.WebSockets.WebSocketException)
{
// WCF Client has a bug which throws WebSocketException when the server closes the connection.
// The remote party closed the WebSocket connection without completing the close handshake.
comObj.Abort();
}
After this issue is resolved, we need to revert the code changes (remove the above code from ScenarioTestHelpers.cs) and do not catch WebSocketException when closing the channel.
Stack log
WebSocketTests.WebSocket_Http_RequestReply_Streamed(messageEncoding: Text) [FAIL]
System.Net.WebSockets.WebSocketException : The remote party closed the WebSocket connection without completing the close handshake.
Stack Trace:
at System.ServiceModel.Channels.WebSocketTransportDuplexSessionChannel.ThrowOnPendingException(Exception& pendingException)
at System.ServiceModel.Channels.WebSocketTransportDuplexSessionChannel.WebSocketMessageSource.ReceiveAsync(TimeSpan timeout)
at System.ServiceModel.Channels.SynchronizedMessageSource.ReceiveAsync(TimeSpan timeout)
at System.ServiceModel.Channels.TransportDuplexSessionChannel.EnsureInputClosedAsync(TimeSpan timeout)
at System.ServiceModel.Channels.TransportDuplexSessionChannel.OnCloseAsync(TimeSpan timeout)
at System.ServiceModel.Channels.WebSocketTransportDuplexSessionChannel.OnCloseAsync(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.OnCloseAsyncInternal(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.System.ServiceModel.IAsyncCommunicationObject.CloseAsync(TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.OnCloseAsync(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.OnCloseAsyncInternal(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.System.ServiceModel.IAsyncCommunicationObject.CloseAsync(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.CloseAsyncInternal(TimeSpan timeout)
at System.Runtime.TaskHelpers.WaitForCompletion(Task task)
at System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)
at System.ServiceModel.Channels.CommunicationObject.Close()
at System.ServiceModel.Channels.ServiceChannelProxy.System.ServiceModel.ICommunicationObject.Close()
//src/System.Private.ServiceModel/tests/Common/Scenarios/ScenarioTestHelpers.cs(197,0): at ScenarioTestHelpers.CloseCommunicationObjects(ICommunicationObject[] objects)
//src/System.Private.ServiceModel/tests/Scenarios/Extensibility/WebSockets/WebSocketTests.4.1.0.cs(484,0):