Как использовать 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);
}

person Mark Ingram    schedule 31.10.2008    source источник
comment
Все еще исключение ProtocolViolationException? Можете ли вы составить короткую, но полную программу, демонстрирующую проблему? Вы смотрели на провод (например, с помощью Wireshark), чтобы увидеть, что происходит?   -  person Jon Skeet    schedule 31.10.2008
comment
Спасибо за обновления .. которые исправили мою проблему.   -  person TravisWhidden    schedule 27.01.2010
comment
Эти два метода совершенно разные: BeginGetResponse предназначен для выполнения веб-запроса, а BeginGetRequestStream — для записи данных в поток.   -  person BlueRaja - Danny Pflughoeft    schedule 20.04.2014


Ответы (4)


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

person Jon Skeet    schedule 31.10.2008
comment
ОК, все в порядке — как мне использовать HttpWebRequest с методом GET? Я действительно не хочу иметь 2 логических пути, зависящих от того, является ли это GET/POST (используя WebClient для GET). - person Mark Ingram; 31.10.2008
comment
Получайте поток запроса, только если у вас есть тело. Если у вас есть тело и вы делаете запрос GET, ваша ошибка в другом месте. - person Jon Skeet; 31.10.2008
comment
Там нет тела, но мне нужно получить поток запросов, так как я получаю результат от REST API. - person Mark Ingram; 31.10.2008
comment
Извините, имел ввиду поток ответов - мне нужно получить результат от сервера. - person Mark Ingram; 31.10.2008
comment
Нет, это означает, что вам нужен поток response. Поток запроса — это тело, которое вы отправляете. С GET вы не отправляете тело. - person Jon Skeet; 31.10.2008
comment
Черт, я ненавижу столкновения. Да, вам нужен поток ответов. Если вы попытаетесь сделать это синхронно, вы все равно получите ошибку? - person Jon Skeet; 31.10.2008
comment
Это в Silverlight, так что у меня нет такой роскоши :-/. (Мой выбор функций: BeginGetRequestStream/EndGetRequestStream и BeginGetResponse/EndGetResponse). - person Mark Ingram; 31.10.2008

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

person Mark Renouf    schedule 31.10.2008
comment
при работе с phone7, в частности, это уместный ответ. действие установки contentType в запросе GET приведет к исключению нарушения протокола после завершения запроса. - person Sky Sanders; 28.03.2012

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

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

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

person Tor Haugen    schedule 31.10.2008

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

person MarkPflug    schedule 23.08.2010