尝试实现ONVIF服务器的SOAP Action不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试实现ONVIF服务器的SOAP Action不匹配相关的知识,希望对你有一定的参考价值。

我正在尝试在http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl上实现C#WCF服务器到ONVIF规范。我使用了生成合同代码

 SvcUtil.exe http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl

它生成DevicePTZ接口。然后我创建了生成的接口的实现,并使用像这样的ServiceHost公开它:

        serviceHost = new ServiceHost(typeof(OnvifImpl), baseUri);

        serviceHost.AddServiceEndpoint(typeof(Device), new WSHttpBinding(), "device_service");
        serviceHost.AddServiceEndpoint(typeof(PTZ), new WSHttpBinding(), "ptz");

当我在我的服务器上指向Onvif设备管理器2.2.250(https://sourceforge.net/projects/onvifdm/)时,我的服务器中出现异常“消息上指定的SOAP操作','与HTTP SOAP Action不匹配,'http://www.onvif.org/ver10/device/wsdl/GetScopes'。”。 Wireshark显示请求没有任何SOAP标头。但是,据我所知,客户端是针对相同的WSDL文件开发的。

我恐怕我对ONVIF,SOAP,Web服务和WCF都是全新的,所以我不知道问题出在哪里。我已经看到了修改客户端的各种建议,但这不是一个选项。

答案

答案是使用自定义绑定来删除WS-Addressing。这就是客户端代码的作用,所以我也是这样做的。我不完全确定这是一个“解决方案”还是“解决方法”,但它让两个人交谈。

var binding = new CustomBinding(new BindingElement[] { 
    new TextMessageEncodingBindingElement(MessageVersion.Soap12, Encoding.UTF8),
    new HttpTransportBindingElement(),
});

serviceHost.AddServiceEndpoint(typeof(Device), binding, "device_service");
serviceHost.AddServiceEndpoint(typeof(PTZ), binding, "ptz");

关键的区别是使用MessageVersion.Soap12而不是MessageVersion.Soap12WSAddressing10这是默认值。

以上是关于尝试实现ONVIF服务器的SOAP Action不匹配的主要内容,如果未能解决你的问题,请参考以下文章

onvif是什么?(Open Network Video Interface Forum 开放式网络视频接口论坛)SOAP

onvif 开发中的一些重要函数介绍

onvid提示账号密码错误

使用gSOAP工具生成onvif框架代码

Qt编写Onvif搜索及云台控制工具

vb.net 中的 ONVIF GetSnapshotUri