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

Все еще исключение ProtocolViolationException? Можете ли вы составить короткую, но полную программу, демонстрирующую проблему? Вы смотрели на провод (например, с Wireshark), чтобы узнать, что происходит?

Jon Skeet 31.10.2008 17:28

Спасибо за обновления .. это тоже устранило мою проблему.

TravisWhidden 27.01.2010 21:09

Эти два метода совершенно разные - BeginGetResponse предназначен для создания веб-запроса, а BeginGetRequestStream предназначен для записи данных в поток.

BlueRaja - Danny Pflughoeft 20.04.2014 10:52
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
28
3
59 823
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

В частности, при работе с phone7 это актуальный ответ. акт установки contentType в запросе GET приведет к исключению нарушения протокола после завершения запроса.

Sky Sanders 28.03.2012 17:01
Ответ принят как подходящий

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

Хорошо, все в порядке - как мне использовать HttpWebRequest с методом GET? Я действительно не хочу иметь 2 логических пути, зависящих от того, GET / POST (с использованием WebClient для GET).

Mark Ingram 31.10.2008 17:22

Выбирайте поток запроса, только если у вас есть тело. Если у вас есть тело и вы делаете запрос GET, ваша ошибка находится в другом месте.

Jon Skeet 31.10.2008 17:27

Тела нет, но мне нужно получить поток запроса, так как я получаю результат из REST api.

Mark Ingram 31.10.2008 17:33

Пардон, имел ввиду поток ответа - мне нужно получить результат с сервера.

Mark Ingram 31.10.2008 17:34

Нет, это означает, что вам нужен поток отклик. Поток запроса - это тело, которое вы отправляете. С GET вы не отправляете тело.

Jon Skeet 31.10.2008 17:34

Черт возьми, я ненавижу столкновения. Да, вам нужен поток ответов. Если вы попытаетесь сделать это синхронно, вы все равно получите ошибку?

Jon Skeet 31.10.2008 17:35

Это в Silverlight, поэтому у меня нет такой роскоши: - /. (Я выбрал функции BeginGetRequestStream / EndGetRequestStream и BeginGetResponse / EndGetResponse).

Mark Ingram 31.10.2008 17:37

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

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

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

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

Другие вопросы по теме