2016-03-07 31 views
0

我試圖在http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl的ONVIF規範中實現C#WCF服務器。我已經生成使用嘗試實現ONVIF服務器的SOAP操作不匹配

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操作」http://www.onvif.org/ver10/device/wsdl/GetScopes「不匹配。」 Wireshark顯示該請求沒有任何SOAP頭。但是,據我所知,客戶端是針對相同的WSDL文件開發的。

恐怕我對ONVIF,SOAP,Web服務和WCF都是全新的,所以我不知道問題出在哪裏。我看到了各種建議來修改客戶端,但這不是一種選擇。

回答

0

答案是使用自定義綁定來刪除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這是默認的。