Проблема была в заголовке
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» будет остановлен.