服务器关闭保持活动http连接时检测或避免客户端通信异常

本文关键字:检测 客户端 异常 通信 连接 http 活动 服务器 | 更新日期: 2023-09-27 18:25:29

我正在为运行嵌入式Linux的设备(Pelco品牌的视频圆顶)中的SOAP服务开发一个VS2010 Dotnet 4.0客户端。我无法控制设备中的SOAP服务器。供应商提供了WSDL文件,这些文件作为服务引用正确加载。

我使用命令行桌面客户端来解决这个问题(在将代码迁移到服务之前)。

简化一点,各种服务中的SOAP调用采用如下形式:

 service.SetPosition(pan,tilt,zoom)
 var pos = service.GetPosition();

等等。他们基本上是按预期工作。

问题是:偶尔,在我还没有弄清楚的模式下,这些服务调用中的一个随机调用会抛出一个CommunicationException,其消息是

 The underlying connection was closed: A connection that was 
 expected to be kept alive was closed by the server.

以下是我如何构建我的服务对象:

  var binding = new System.ServiceModel.BasicHttpBinding();
  uri = new Uri(/*the correct uri for the service*/);
  address = new System.ServiceModel.EndpointAddress(u);
  service = new PositioningControlPortTypeClient(binding, address);

在这种情况下,当我将PositioningControlPortTypeClient作为服务引用加载时,它是通过WSDL定义的。

有没有办法强制dotnet4.0/wcf/soap使用HTTP/1.0?

有没有一种方法可以在我的服务客户端抛出这个异常之前检测到它即将抛出这个异常?

我应该只使用每个服务对象一次,然后处理它吗?

还有其他智慧吗?

服务器关闭保持活动http连接时检测或避免客户端通信异常

您可以尝试在绑定中禁用Keep-alive:

  var binding = new System.ServiceModel.BasicHttpBinding();
  uri = new Uri(/*the correct uri for the service*/);
  address = new System.ServiceModel.EndpointAddress(u);
  CustomBinding cbinding = new CustomBinding(binding);
  foreach (BindingElement be in cbinding.Elements)
  {
      if (be is HttpTransportBindingElement) ((HttpTransportBindingElement)be).KeepAliveEnabled = false;
  }
  service = new PositioningControlPortTypeClient(cbinding, address);