Проблема с веб-клиентом: ожидание не удалось? - PullRequest
4 голосов
/ 04 июня 2010

У меня есть собственный обработчик Http, который манипулирует HTTP POST и GET. Я получил проект, работающий на отдельном изолированном сервере, теперь нужно запустить его в производство ...

using (var client = new WebClient())
                {
                    client.Credentials = CredentialCache.DefaultCredentials;
                    client.UploadFile("serverlocation:port", fileToUpload);
                }

По какой-то причине теперь при использовании client.UploadFile("", file);, то есть форсирование HTTP POST

System.Net.WebException: The remote server returned an error: (417) Expectation failed.

   at System.Net.WebClient.UploadFile(Uri address, String method, String fileName)

Что бы это могло быть? Я знаю, что код работает, и что еще? Может, сервер блокирует HTTP POST-запросы?

Я попытался добавить:

ServicePointManager.Expect100Continue = false;

Но не увенчались успехом, хотя я не уверен на 100%, где этот код должен был раньше, я предполагаю, прежде чем я использую WebClient


Редактировать 0:

Я только что прочитал следующее:

Из-за наличия более старых реализаций протокол позволяет неоднозначные ситуации, в которых клиент может отправить "Ожидайте: 100- продолжить "без получения статуса 417 (ожидание не выполнено) или статус 100 (Продолжить). Поэтому, когда клиент отправляет это поле заголовка для исходного сервера (возможно, через прокси), с которого оно никогда не видел статус 100 (Продолжить), клиент не должен ждать на неопределенный срок перед отправкой тела запроса.

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

Редактировать 1:

Поверьте, эта проблема должна быть с 100-continue, потому что, используя fiddler, чтобы точно увидеть, что мое приложение отправляет с WebClient.UploadFile, показывает это:

POST http://XXX.XXX.XXX.XXX:8091/file.myhandledextension HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------8ccd1eb03f78bc2
Host: XXX.XXX.XXX.XXX:8091
Content-Length: 4492
Expect: 100-continue

Несмотря на то, что поставили эту строку: ServicePointManager.Expect100Continue = false; перед оператором using. Я не думаю, что эта строка действительно работает.

1 Ответ

3 голосов
/ 04 июня 2010

Я решил эту проблему, поместив ServicePointManager.Expect100Continue = false; в конструктор для вызывающего класса WebClient.

Затем я использовал Fiddler , чтобы проверить запрос POST, чтобы убедиться, что Expect: 100-continue больше не был в запросе.

...