Подтвердить что ты не робот

Как использовать HttpWebRequest с методом GET

У меня есть следующий код, который отлично работает, когда метод "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);
}
4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Мораль: прочитайте документы; -)

Ответ 4

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