Как использовать HttpWebRequest с методом GET - PullRequest
28 голосов
/ 31 октября 2008

У меня есть следующий код, который прекрасно работает, когда метод "POST", но изменение на "GET" не работает:

HttpWebRequest request = null;
request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Method = "POST"; // Doesn't work with "GET"

request.BeginGetRequestStream(this.RequestCallback, null);

Я получаю исключение ProtocolViolationException с помощью метода "GET".

Редактировать: После просмотра с использованием Reflector кажется, что есть явная проверка для метода "GET", если он установлен на то, что он выдает исключение.

Edit2: Я обновил свой код до следующего, но он по-прежнему выдает исключение при вызове EndGetResponse ()

if (request.Method == "GET")
{
    request.BeginGetResponse(this.ResponseCallback, state);
}
else
{
    request.BeginGetRequestStream(this.RequestCallback, state);
}

В моей функции ResponseCallback у меня есть это:

HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

Что также вызывает исключение.

Ответ

Вышеприведенный код теперь работает, я забыл вынуть строку Content-Type, которая вызывала исключение в конце. +1 к настройке и ответ Джону.

Рабочий код теперь ниже:

HttpWebRequest request = null;
request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.Method = "GET";// Supports POST too

if (request.Method == "GET")
{
    request.BeginGetResponse(this.ResponseCallback, state);
}
else
{
    request.BeginGetRequestStream(this.RequestCallback, state);
}

Ответы [ 4 ]

12 голосов
/ 31 октября 2008

Это указано в документации . По сути, запросы GET не должны содержать тела, поэтому нет разумной причины для вызова BeginGetRequestStream.

5 голосов
/ 31 октября 2008

Имеет ли смысл GET-запрос на отправку Content-Type? Вы пытались удалить третью строку?

1 голос
/ 23 августа 2010

В документации для GetRequestStream указано, что он вызовет исключение ProtocolViolationException, если метод GET. Однако в спецификации HTTP я ничего не могу найти, чтобы предположить, что это действительно нарушение протокола HTTP. Считай это проблемой.

1 голос
/ 31 октября 2008

BeginGetRequestStream используется для получения потока специально для записи данных в запрос. Это не относится к запросам GET.

В документации для метода BeginGetRequestStream прямо указывается, что метод генерирует исключение ProtocolViolationException, если для метода задано значение GET или HEAD.

Боевой дух: читать документы; -)

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