У меня есть следующий код, который отлично работает, когда используется метод «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);
}
Спасибо за обновления .. это тоже устранило мою проблему.
Эти два метода совершенно разные - BeginGetResponse предназначен для создания веб-запроса, а BeginGetRequestStream предназначен для записи данных в поток.





Имеет ли смысл для GET-запроса отправлять Content-Type? Вы пытались удалить третью строку?
В частности, при работе с phone7 это актуальный ответ. акт установки contentType в запросе GET приведет к исключению нарушения протокола после завершения запроса.
Это указано в документации. По сути, запросы GET не предназначены для содержания тел, поэтому нет разумной причины вызывать BeginGetRequestStream.
Хорошо, все в порядке - как мне использовать HttpWebRequest с методом GET? Я действительно не хочу иметь 2 логических пути, зависящих от того, GET / POST (с использованием WebClient для GET).
Выбирайте поток запроса, только если у вас есть тело. Если у вас есть тело и вы делаете запрос GET, ваша ошибка находится в другом месте.
Тела нет, но мне нужно получить поток запроса, так как я получаю результат из REST api.
Пардон, имел ввиду поток ответа - мне нужно получить результат с сервера.
Нет, это означает, что вам нужен поток отклик. Поток запроса - это тело, которое вы отправляете. С GET вы не отправляете тело.
Черт возьми, я ненавижу столкновения. Да, вам нужен поток ответов. Если вы попытаетесь сделать это синхронно, вы все равно получите ошибку?
Это в Silverlight, поэтому у меня нет такой роскоши: - /. (Я выбрал функции BeginGetRequestStream / EndGetRequestStream и BeginGetResponse / EndGetResponse).
BeginGetRequestStream используется для получения потока специально для записи данных в запрос. Это не применимо к запросам GET.
В документации к методу BeginGetRequestStream явно указано, что этот метод вызовет исключение ProtocolViolationException, если Method имеет значение GET или HEAD.
Боевой дух: читайте документацию ;-)
В документации для GetRequestStream указано, что он вызовет исключение ProtocolViolationException, если используется метод GET. Однако я не могу найти ничего в Спецификация HTTP, чтобы предположить, что это на самом деле нарушение протокола HTTP. Считайте это проблемой.
Все еще исключение ProtocolViolationException? Можете ли вы составить короткую, но полную программу, демонстрирующую проблему? Вы смотрели на провод (например, с Wireshark), чтобы узнать, что происходит?