0

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

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

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

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

等等。他们基本上工作并做预期的事情。

问题是这样的:偶尔,间歇性地,以我还没有(尚未)弄清楚的模式,这些服务调用中的一个随机抛出一个 CommunicationException,其 Message 是

 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 定义。

有没有办法强制 dotnet 4.0/wcf/soap 使用 HTTP/1.0?

有没有办法检测到我的服务客户端将在它抛出之前抛出这个异常?

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

还有什么智慧吗?

4

1 回答 1

1

您可以尝试在绑定中禁用 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);
于 2013-07-29T23:25:25.340 回答