SOAP Onvif对WCF客户端无响应

时间:2018-09-01 11:25:01

标签: wcf soap soapui wireshark onvif

我有支持Onvif的相机。调用OnVif SOAP GetDeviceInformation

var dd = {
    content: [
        'First paragraph',
        'Another paragraph, this time a little bit longer to make sure, this line will be divided into at least two lines'
    ],
    watermark:{
        text:'              Niklesh Raut              ',
    }

}

使用SoapUI时我得到了答案。我创建了简单的WCF控制台应用程序来调用相同的方法-相机没有应答。

我用wireshart检查了发送的消息:

SoapUI:

<s:Envelope
    xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Body
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <GetDeviceInformation
            xmlns="http://www.onvif.org/ver10/device/wsdl"/>
        </s:Body>
    </s:Envelope>

WCF客户端:

Frame 8858: 680 bytes on wire (5440 bits), 680 bytes captured (5440 bits) on interface 0
Ethernet II, Src: IntelCor_fc:da:96 (b4:b6:76:fc:da:96), Dst: Shenzhen_a4:9f:e8 (e8:ab:fa:a4:9f:e8)
Internet Protocol Version 4, Src: 10.0.0.8, Dst: 10.0.0.102
Transmission Control Protocol, Src Port: 61385, Dst Port: 888, Seq: 1, Ack: 1, Len: 626
Hypertext Transfer Protocol
    POST /onvif/device_service HTTP/1.1\r\n
    Accept-Encoding: gzip,deflate\r\n
    Content-Type: application/soap+xml;charset=UTF-8;action="http://www.onvif.org/ver10/device/wsdl/GetDeviceInformation"\r\n
    Content-Length: 322\r\n
        [Content length: 322]
    Host: 10.0.0.102:888\r\n
    Connection: Keep-Alive\r\n
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)\r\n
    \r\n
    [Full request URI: http://10.0.0.102:888/onvif/device_service]
    [HTTP request 1/1]
    [Response in frame: 8891]
    File Data: 322 bytes
eXtensible Markup Language
    <s:Envelope
        xmlns:s="http://www.w3.org/2003/05/soap-envelope">
        <s:Body
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <GetDeviceInformation
                xmlns="http://www.onvif.org/ver10/device/wsdl"/>
            </s:Body>
        </s:Envelope>

在项目中添加了WSDL Onvif WSDL参考之后的以下WCF代码:

Frame 11631: 315 bytes on wire (2520 bits), 315 bytes captured (2520 bits) on interface 0
Ethernet II, Src: IntelCor_fc:da:96 (b4:b6:76:fc:da:96), Dst: Shenzhen_a4:9f:e8 (e8:ab:fa:a4:9f:e8)
Internet Protocol Version 4, Src: 10.0.0.8, Dst: 10.0.0.102
Transmission Control Protocol, Src Port: 61420, Dst Port: 888, Seq: 282, Ack: 1, Len: 261
[2 Reassembled TCP Segments (542 bytes): #11629(281), #11631(261)]
Hypertext Transfer Protocol
    POST /onvif/device_service HTTP/1.1\r\n
    Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetDeviceInformation"\r\n
    Host: 10.0.0.102:888\r\n
    Content-Length: 261\r\n
        [Content length: 261]
    Expect: 100-continue\r\n
    Accept-Encoding: gzip, deflate\r\n
    Connection: Keep-Alive\r\n
    \r\n
    [Full request URI: http://10.0.0.102:888/onvif/device_service]
    [HTTP request 1/1]
    File Data: 261 bytes
eXtensible Markup Language
    <s:Envelope
        xmlns:s="http://www.w3.org/2003/05/soap-envelope">
        <s:Body
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
            <GetDeviceInformation
                xmlns="http://www.onvif.org/ver10/device/wsdl"/>
            </s:Body>
        </s:Envelope>

有什么主意为什么相机不响应WCF客户端?

为什么要重新组装生产线:

namespace OnVifInfo
{
    class Program
    {
        static void Main(string[] args)
        {
            GetDeviceInfo(new Uri("http://10.0.0.102:888/onvif/device_service"));
        }

        private static void GetDeviceInfo(Uri uri)
        {
            string address = uri.AbsoluteUri.ToString();

            var messageElement = new TextMessageEncodingBindingElement()
            {
                MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None)
            };
            HttpTransportBindingElement httpBinding = new HttpTransportBindingElement()
            {
                AuthenticationScheme = System.Net.AuthenticationSchemes.Negotiate
            };

            CustomBinding binding = new CustomBinding(messageElement, httpBinding);
            OnVifWebService.DeviceClient service = new OnVifWebService.DeviceClient(binding, new EndpointAddress(address));

            string model;
            string firmwareVersion;
            string serialNumber;
            string hardwareId;
            var response = service.GetDeviceInformation(out model, out firmwareVersion, out serialNumber, out hardwareId);
        }
    }
}

在WCF客户端请求中,但不在SoapUI调用中

1 个答案:

答案 0 :(得分:0)

问题是Expect HTML标头

Expect: 100-continue\r\n

当我将其添加到WCF代码中

System.Net.ServicePoint servicePoint =    System.Net.ServicePointManager.FindServicePoint(service.Endpoint.Address.Uri);
servicePoint.Expect100Continue = false;

它删除了Expect标头,我从相机中得到了答案。