Когда я пытаюсь POST к URL, это приводит к следующему исключению:
Удаленный сервер возвратил ошибку: (417) Ошибка ожидания.
Вот пример кода:
var client = new WebClient();
var postData = new NameValueCollection();
postData.Add("postParamName", "postParamValue");
byte[] responseBytes = client.UploadValues("http://...", postData);
string response = Encoding.UTF8.GetString(responseBytes); // (417) Expectation Failed.
Использование HttpWebRequest/HttpWebResponse
пары или HttpClient
не имеет значения.
Что вызывает это исключение?
Expect
заголовок, который по умолчанию добавляется какExpect100Continue
естьtrue
по умолчанию.Ответы:
System.Net.HttpWebRequest добавляет заголовок «HTTP-заголовок« Expect: 100-Continue »» к каждому запросу, если только вы явно не просите об этом, установив для этого статического свойства значение false:
Некоторые серверы заглушают этот заголовок и возвращают ошибку 417, которую вы видите.
Дайте этому шанс.
источник
По-другому -
Добавьте эти строки в раздел конфигурации файла конфигурации вашего приложения:
источник
Та же самая ситуация и ошибка могут также возникнуть с мастером по умолчанию, сгенерированным прокси-сервером веб-службы SOAP (не 100%, если это также имеет место в WCF).
System.ServiceModel
стеке ), когда во время выполнения:Expect
заголовок как часть HTTPPOST
илиPUT
запроса из-за стандартного протокола протокола отправки запроса в двух частях, как описано в примечаниях здесь )... получая 417.
Как описано в других ответах, если конкретная проблема, с которой вы сталкиваетесь, заключается в том, что
Expect
заголовок вызывает проблему, то эту конкретную проблему можно обойти, выполнив относительно глобальное отключение двухчастной передачи PUT / POST черезSystem.Net.ServicePointManager.Expect100Continue
.Однако это не решает основную проблему - стек все еще может использовать специфичные для HTTP 1.1 вещи, такие как KeepAlives и т. Д. (Хотя во многих случаях другие ответы охватывают основные случаи).
Однако реальная проблема заключается в том, что автоматически сгенерированный код предполагает, что можно использовать вслепую, используя средства HTTP 1.1, поскольку все это понимают. Чтобы прекратить это предположение для определенного прокси-сервера веб-службы, можно изменить переопределение значения
HttpWebRequest.ProtocolVersion
по умолчанию на значение по умолчанию для 1.1, путем создания производного класса Proxy, который переопределяет, как показано в этом посте : -protected override WebRequest GetWebRequest(Uri uri)
(где
MyWS
находится прокси, над которым выпал мастер добавления веб-ссылок?)ОБНОВЛЕНИЕ: Вот что я использую в производстве:
источник
Имеет ли форма, которую вы пытаетесь эмулировать, два поля: имя пользователя и пароль?
Если это так, эта строка:
не является правильным.
вам понадобятся две строки вроде:
Редактировать:
Хорошо, так как это не проблема, один из способов решения этой проблемы - использовать что-то вроде Fiddler или Wireshark для успешного просмотра того, что отправляется на веб-сервер из браузера, а затем сравнить это с тем, что отправляется из вашего кода. Если вы идете на обычный порт 80 из .Net, Fiddler по-прежнему будет захватывать этот трафик.
Возможно, в форме есть еще одно скрытое поле, которое веб-сервер ожидает, что вы не отправляете.
источник
Решение со стороны прокси, я столкнулся с некоторыми проблемами в процессе рукопожатия SSL, и мне пришлось заставить мой прокси-сервер отправлять запросы, используя HTTP / 1.0, чтобы решить эту проблему, установив этот аргумент в httpd.conf,
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
после чего я столкнулся с ошибкой 417 как мое клиентское приложение использовало HTTP / 1.1 и прокси был вынужден использовать HTTP / 1.0, проблема была решена путем установки этого параметра в httpd.conf на стороне проксиRequestHeader unset Expect early
без необходимости что-либо менять на стороне клиента, надеюсь, это поможет ,источник
Для Powershell это
источник
Если вы используете « HttpClient » и не хотите использовать глобальную конфигурацию, чтобы повлиять на все ваши программы, которые вы можете использовать:
Если вы используете " WebClient ", я думаю, вы можете попытаться удалить этот заголовок, вызвав:
источник
В моей ситуации эта ошибка возникает только в том случае, если на компьютере моего клиента установлена строгая политика брандмауэра, которая не позволяет моей программе взаимодействовать с веб-службой.
Поэтому единственное решение, которое я смог найти, - это отловить ошибку и сообщить пользователю об изменении настроек брандмауэра вручную.
источник
Подход web.config работает для вызовов служб формы InfoPath к правилам, включенным в веб-службу IntApp.
источник