SOAP Onvif нет ответа для клиента WCF - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть камера, которая поддерживает Onvif. Вызов OnVif SOAP GetDeviceInformation

<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>

Я получаю ответ при использовании SoapUI. Я создал простое консольное приложение WCF для вызова того же метода - без ответа с камеры.

Я проверил с помощью Wireshart отправленные сообщения:

SoapUI:

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>

Клиент 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 после того, как WSDL Onvif Ссылка на WSDL была добавлена ​​в проект:

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?

Почему существует линия повторной сборки:

[2 Reassembled TCP Segments (542 bytes): #11629(281), #11631(261)]

в запросе клиента WCF, но не в вызове SoapUI

1 Ответ

0 голосов
/ 02 сентября 2018

Проблема с заголовком Expect HTML

Expect: 100-continue\r\n

Когда я добавил это в код WCF

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

Он удалил заголовок Expect, и я получил ответ от камеры.

...