C# - Нет тела POST в запросе WS SOAP 1.2 с WSHttpBinding - PullRequest
0 голосов
/ 15 апреля 2020

Я застрял с запросом SOAP 1.2 к устройству ONVIF.

Мой код:

        var c = "http://192.168.31.12:5000/onvif/device_service";

        var wsBinding = new WSHttpBinding(SecurityMode.None);
        wsBinding.Name = "My WSHttpBinding";

        wsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
        CustomBinding l_CustomBinding = new CustomBinding(wsBinding);
        MessageEncodingBindingElement l_EncodingElement =
             l_CustomBinding.Elements.Find<MessageEncodingBindingElement>();
        l_EncodingElement.MessageVersion = MessageVersion.Soap12;

        EndpointAddress endpointAddress = new EndpointAddress(c);

        fgdfsdfsdg.ServiceReference1.DeviceClient cl = new ServiceReference1.DeviceClient(l_CustomBinding, endpointAddress);
        fgdfsdfsdg.ServiceReference1.GetDeviceInformationRequest inValue = new fgdfsdfsdg.ServiceReference1.GetDeviceInformationRequest();
        var Q = cl.GetDeviceInformationAsync(inValue).Result;

Что я вижу в Wireshark:

POST /onvif/device_service HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetDeviceInformation"
Host: 192.168.31.12:5000
Content-Length: 261
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Что ожидает WS:

POST /onvif/device_service HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8; action="http://www.onvif.org/ver10/device/wsdl/GetDeviceInformation"
Host: 192.168.31.12:5000
Content-Length: 261
Accept-Encoding: gzip, deflate
Connection: Close

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

Что я должен добавить к своему коду, чтобы C# также отправлял тело запроса, а не только заголовки в запросе HTTP POST?

1 Ответ

0 голосов
/ 15 апреля 2020

Проблема была в заголовке

Expect: 100-continue

, который исходит от HttpWebRequest. Чтобы отключить этот заголовок, мне пришлось добавить

System.Net.ServicePointManager.Expect100Continue = false;

перед моим кодом, ie мой код теперь

        var c = "http://192.168.31.12:5000/onvif/device_service";

        System.Net.ServicePointManager.Expect100Continue = false;

        var wsBinding = new WSHttpBinding(SecurityMode.None);
        wsBinding.Name = "My WSHttpBinding";

        wsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;

        CustomBinding l_CustomBinding = new CustomBinding(wsBinding);
        MessageEncodingBindingElement l_EncodingElement =
             l_CustomBinding.Elements.Find<MessageEncodingBindingElement>();
        l_EncodingElement.MessageVersion = MessageVersion.Soap12;

Решение было найдено здесь https://haacked.com/archive/2004/05/15/http-web-request-expect-100-continue.aspx/:

Очевидно, я не единственный, кто столкнулся с этой надоедливой проблемой. При использовании HttpWebRequest для POST-данных формы с использованием HTTP 1.1 он ВСЕГДА добавляет следующий HTTP-заголовок «Expect: 100-Continue». Решение проблемы оказалось неуловимым.

Согласно протоколу HTTP 1.1, при отправке этого заголовка данные формы не отправляются с первоначальным запросом. Вместо этого этот заголовок отправляется на веб-сервер, который отвечает 100 (Продолжить), если реализовано правильно. Однако не все веб-серверы обрабатывают это правильно, включая сервер, на котором я пытаюсь разместить данные. Я прослушал заголовки, которые отправляет Inte rnet Explorer, и заметил, что он не отправляет этот заголовок, но мой код делает.

.................. .....

ОБНОВЛЕНИЕ: Ланс Олсон указывает мне на решение в моем разделе комментариев. Класс System. Net .ServicePointManager имеет свойство stati c с именем Expect100Continue. Если задать значение false, заголовок «Expect: 100-Continue» будет остановлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...