gpt4 book ai didi

c# - 当服务器关闭 keep-alive http 连接时检测或避免客户端 CommunicationException

转载 作者:太空宇宙 更新时间:2023-11-04 11:21:31 24 4
gpt4 key购买 nike

我正在为运行嵌入式 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 定义的。

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

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

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

还有其他智慧吗?

最佳答案

您可以尝试在绑定(bind)中禁用 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);

关于c# - 当服务器关闭 keep-alive http 连接时检测或避免客户端 CommunicationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17935389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com