我正在为运行嵌入式 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?
有没有办法检测到我的服务客户端将在它抛出之前抛出这个异常?
我应该只使用每个服务对象一次,然后处置它吗?
还有什么智慧吗?