【问题标题】:Handling WebSocket closed connection in WCF在 WCF 中处理 WebSocket 关闭连接
【发布时间】:2018-09-04 12:44:34
【问题描述】:

我有一个使用一些 WCF WebSocket 服务的应用程序。现在如果主机关闭连接,我会得到以下异常:

  • System.Net.Sockets.SocketException
  • System.Net.WebSockets.WebSocketException
  • System.ServiceModel.CommunicationException

现在我想在我的客户端应用程序中处理这些异常并尝试重新连接/通知用户等。 但是如何准确捕获这些异常呢?

可能与通道故障事件有关。 我试过这个:

context = new InstanceContext(this);
var endpointAddress = new EndpointAddress(ServerFullAddress);
context.Faulted += Channel_Faulted;    
client = new ServiceName(context, "NetHttpBinding_ServiceName", endpointAddress);

但是 ChannelFaulted 方法永远不会被执行。如何正确连接这个事件,这个方法会在 websocket 关闭时被执行。

我的另一个想法是实现一些全局异常处理程序并在那里捕获这些异常?你怎么看?

【问题讨论】:

  • 我看到了,但我没有看到任何可以适应我的场景的东西。我需要捕捉那些异常;p
  • 你看示例c#代码了吗?
  • 是的,它是关于处理服务中的故障。我的服务没有任何问题。我的问题是当服务关闭通信套接字时出现异常
  • 服务器从不启动连接。因此,当客户端关闭时,客户端需要重新连接。 websocket 包含一个监听器(参见:docs.microsoft.com/en-us/dotnet/api/…),只要监听器在工作,它就会接受一个新的连接。您遇到问题的唯一情况是第一个连接是否完全关闭。您只能有一个具有相同源 IP、目标 IP 和端口号的连接。因此,当第一个连接关闭时,您无法使用相同的 IP 和端口号重新连接。

标签: c# wcf websocket


【解决方案1】:

如果您控制服务,请尝试发送Faults而不是Exception,这可以通过几个方法简单地完成,

但我怀疑它没有命中 Faulted 事件的原因是,您的 ChannelFactory 不是出错的那个,而是 clientChannel,

IClientChannel channel = (IClientChannel) Factory.CreateChannel();,您可以检查通道对象的状态并使用上述方法重新创建它,通常,OpenedState 状态是您在通道对象中寻找的状态,关闭、关闭等意味着要么通道未打开,或已中止或出现故障。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 2019-10-22
  • 2012-08-08
  • 2015-10-21
  • 2012-02-21
相关资源
最近更新 更多