Сервер совершил нарушение протокола. Section = ResponseStatusLine ERROR - PullRequest
104 голосов
/ 20 марта 2010

Я создал программу, попытался опубликовать строку на сайте и получаю эту ошибку:

"Сервер совершил нарушение протокола. Section = ResponseStatusLine"

после этой строки кода:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

Как я могу исправить это исключение?

Ответы [ 17 ]

69 голосов
/ 20 марта 2010

Попробуйте добавить это в ваше приложение / web.config:

<system.net>
    <settings>
        <httpWebRequest useUnsafeHeaderParsing="true" />
    </settings>
</system.net>

Если это не работает, вы также можете попробовать установить для свойства KeepAlive значение false.

57 голосов
/ 03 марта 2014

Иногда эта ошибка возникает, когда UserAgent параметр запроса пуст (в моем случае в github.com api).

Установка этого параметра в пользовательскую непустую строку решила мою проблему.

27 голосов
/ 30 апреля 2014

Виновник в моем случае возвращал ответ No Content, но определял тело ответа одновременно. Пусть этот ответ напомнит мне и, возможно, другим не возвращать NoContent ответ с телом когда-либо снова.

Это поведение соответствует 10.2.5 204 Нет содержимого спецификации HTTP , которая гласит:

Ответ 204 НЕ ДОЛЖЕН включать тело сообщения, и поэтому всегда заканчивается первой пустой строкой после полей заголовка.

10 голосов
/ 31 августа 2011

Еще одна возможность: при выполнении POST сервер отвечает ошибкой 100 продолжений.

Это решило проблему для меня:

request.ServicePoint.Expect100Continue = false;
9 голосов
/ 03 июня 2015

Это происходило для меня, когда на моем локальном компьютере работал Skype. Как только я закрыл это исключение исчезло.

Идея предоставлена ​​этой страницей

8 голосов
/ 20 октября 2010

Один из способов отладки (и чтобы убедиться, что проблема связана с нарушением протокола) - это использовать Fiddler (Http Web Proxy) и посмотреть, не возникает ли такая же ошибка.Если это не так (т. Е. Fiddler обработал проблему для вас), вы сможете исправить ее, используя флаг UseUnsafeHeaderParsing.

Если вы ищете способ установить это значение программно, посмотрите примеры здесь:http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline/

8 голосов
/ 03 января 2015

Многие решения говорят об обходном пути, но не об истинной причине ошибки.

Одной из возможных причин этой ошибки является то, что веб-сервер использует кодировку, отличную от ASCII или ISO-8859-1, для вывода раздела ответа заголовка. Причина использования ISO-8859-1 может быть в том случае, если Response-Phrase содержит расширенные латинские символы.

Другая возможная причина этой ошибки - использование веб-сервером UTF-8, который выводит маркер порядка байтов (BOM). Например, постоянная по умолчанию Encoding.UTF8 выводит спецификацию, и это легко забыть. Веб-страницы будут работать корректно в Firefox и Chrome, но HttpWebRequest будет бомбить :). Быстрое решение состоит в том, чтобы изменить веб-сервер для использования кодировки UTF-8, которая не выводит спецификацию, например new UTF8Encoding(false) (что нормально, если Response-Phrase содержит только символы ASCII, но на самом деле он должен использовать ASCII или ISO-8859-1 для заголовков, а затем UTF-8 или другую кодировку для ответа).

6 голосов
/ 02 июня 2016

Skype был основной причиной моей проблемы:

Эта ошибка обычно возникает, когда вы настроили Visual Studio для отладки существующего веб-приложения , работающего в IIS, а не встроенного веб-сервера отладки ASP.NET . IIS по умолчанию прослушивает веб-запросы на порту 80. В этом случае другое приложение уже прослушивает запросы на порту 80. Как правило, нарушающим приложение является Skype, который по умолчанию принимает прослушивание на портах 80 и 443 при установке. Skype уже занимает порт 80. Поэтому IIS не может запуститься.

Для решения проблемы выполните следующие действия:

Skype -> Сервис -> Параметры -> Дополнительно -> Подключение:

Снимите флажок «Использовать порты 80 и 443 в качестве альтернативы для входящих соединений».

И, как указано ниже , выполнить сброс IIS после выполнения.

6 голосов
/ 08 января 2013

Установка ожидаемого значения 100 по-прежнему равна false, а сокращение времени простоя сокета до двух секунд решило проблему для меня

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 
3 голосов
/ 05 февраля 2016

Я попытался получить доступ к Last.fm Rest API из-за прокси и получил эту знаменитую ошибку.

Сервер совершил нарушение протокола. Раздел = ResponseStatusLine

После некоторых обходных путей у меня сработали только эти два

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ProtocolVersion = HttpVersion.Version10;

и

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...