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


115

Я створив програму, спробував розмістити рядок на сайті, і я отримав цю помилку:

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

після цього рядка коду:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

Як я можу виправити цей виняток?

Відповіді:


71

Спробуйте помістити це у свою програму / web.config:

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

Якщо це не працює, ви також можете спробувати встановити KeepAliveвластивість на значення false.


3
У мене було 6 URL-адрес, які кинули цю помилку. Встановлення useUnsafeHeaderParsing зафіксувало його для одного посилання, але налаштування KeepAlive = false виправлено для всіх 6.
Девід Хаммонд

3
Це ж можна помістити всередині кореневого тегу <configuration> в App.copnfig для не веб-додатків (наприклад, я зафіксував додаток WPF таким чином - дякую!).
Юрій Шкатула

хтось знає, чому цей захід безпеки накладається IIS? Це спрацювало, але я не розумію причини обмеження значень заголовка (в моєму випадку встановити їх вручну).
emran

26
Це просто уникнути проблеми, а не фактично її виправити. Я думаю, це не повинно бути рішенням за замовчуванням.
Тобіас

4
Погодьтеся з Тобіасом - ви уникаєте проблеми. Тепер, можливо, проблема полягає в сервері, який ви не можете виправити, і, таким чином, уникнення може бути вашим єдиним варіантом ... але все ж, давайте зрозуміти різницю між тим, як уникати помилки протоколу і фактично його виправити.
metaforge

58

Іноді ця помилка виникає, коли UserAgentпараметр запиту порожній (у моєму випадку apith github.com).

Встановлення цього параметра у власному не порожньому рядку вирішило мою проблему.


5
Ах, це те, що мені було потрібно. Дякую. Ось приклад агента користувача: stackoverflow.com/a/15144495/891976
Девід Ruhmann

Швидка лінія використання з WebClientтут stackoverflow.com/a/11841680/4795214

5
Дякую. Якщо ви хочете отримати запит на GitHub через рядок HttpClient add: client.DefaultRequestHeaders.Add("User-Agent", "Anything");для виправлення.
Cihan Yakar

32

Винувателем у моєму випадку було повернення No Contentвідповіді, але одночасно визначення органу реагування. Нехай ця відповідь нагадує мені, а може, й інші більше не повертатимуться NoContentвідповіді тілом .

Така поведінка узгоджується з 10.2.5 204 Немає змісту в специфікації HTTP , який говорить:

Відповідь 204 НЕ МОЖЕ включати тіло повідомлення і, таким чином, завжди закінчується першим порожнім рядком після полів заголовка.


Просто прочитайте це після того, як я отримав The server committed a protocol violation. Section=ResponseStatusLine помилку під час використання WebApi для повернення власної NoContent()відповіді, яка надсилалась No Contentу відповідь з якихось химерних причин! Одного разу я вийняв це, проблема пішла :)
Вступливий

2
Це також була моєю проблемою, хоча вона була складною, оскільки дзвінок ПІСЛЯ невдалої відповіді "Без вмісту".
mdickin

Виправлено видаленням someContentз return Request.CreateResponse(HttpStatusCode.NoContent, someContent); +1
snippetkid

12

Інша можливість: виконуючи POST, сервер відповідає 100 продовженням неправильним чином.

Це вирішило для мене проблему:

request.ServicePoint.Expect100Continue = false;

Це працювало для мене під час доступу до API MediaFire.
AlexPi

3
Я знаю, що я запізнююсь, але що ви маєте на увазі під "неправильним способом"?
kuskmen

1
Для всіх, хто використовує HttpClient , для мене працювало таке:var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
user2444499

9

Це сталося для мене, коли я працював Skype на своїй локальній машині. Щойно я закрив, що виняток пішов.

Ідея ввічливості цієї сторінки


Мав те саме питання. Виявився Skype. Це так прикро, що належних повідомлень неможливо надати.
jordan koskei

вам насправді не потрібно закривати Skype, я додав відповідь нижче для цього, щоб показати, як боротися з ним, не закриваючи Skype.
AltF4_

8

Один із способів налагодити це (і переконатися, що саме порушення протоколу викликає проблему) - скористатися Fiddler (Http Web Proxy) і побачити, чи не відбувається ця сама помилка. Якщо це не відбувається (тобто Fiddler вирішив проблему за вас), ви повинні мати можливість виправити це за допомогою прапора UseUnsafeHeaderParsing.

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


Fiddler справді вирішує проблему, яку я маю із запитом GET HTTP. Чи можемо ми побачити, що робиться Fiddler?
Олів'є МАТРОТ

8

Багато рішень говорять про вирішення проблеми, але не про фактичну причину помилки.

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

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


Це найкраща відповідь. Це пояснює, чому веб-сервер погано поводиться. Дякую! (Мені доводиться наслідувати веб-сервер сокетами через проблеми з розгортанням HttpListener.)
Ендрю Рондо

6

Установка очікує, що 100 продовжить помилково, а скорочення часу роботи в режимі простою до двох секунд вирішило проблему для мене

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 

6

Скайп був основною причиною моєї проблеми:

Ця помилка зазвичай виникає, коли ви налаштували Visual Studio для налагодження існуючої веб-програми, що працює в IIS, а не вбудованого веб-сервера налагодження ASP.NET . IIS за замовчуванням прослуховує веб-запити на порт 80. У цьому випадку інша програма вже прослуховує запити на порт 80. Зазвичай програмою, яка порушує правила, є Skype, який за замовчуванням приймає прослуховування на портах 80 і 443 при встановленні. Skype вже займає порт 80. Отже, IIS не може запуститися.

Щоб вирішити проблему, виконайте наступні дії:

Skype -> Інструменти -> Опції -> Додатково -> Підключення:

Зніміть прапорець "Використовувати порти 80 та 443 як альтернативи вхідним з'єднанням".

І як зазначено нижче, виконайте скидання IIS після завершення.


2
і не забудьте перезапустити IIS після цього
Ахмед Галал

3

Я спробував отримати доступ до API Last.fm Rest з-за проксі, і отримав цю відому помилку.

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

Спробувавши деякі обхідні шляхи, тільки ці двоє працювали на мене

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

і

HttpWebRequest HttpRequestObj = WebRequest.Create(BaseUrl) as HttpWebRequest;
HttpRequestObj.ServicePoint.Expect100Continue = false;

2

Жодне з рішень не працювало для мене, тому мені довелося використовувати WebClient замість HttpWebRequest, і цього питання більше не було.

Мені потрібно було використовувати CookieContainer, тому я використав рішення, розміщене Павлом Саварою у цій темі - Використання CookieContainer з класом WebClient

просто видаліть "захищений" з цього рядка:

приватний контейнер CookieContainer для читання лише новий CookieContainer ();


2

Ймовірна причина цієї проблеми - конфігурація протоколу автоматичного виявлення веб-проксі (WPAD) у мережі. Запит HTTP буде прозоро відправлений до проксі, який може надіслати відповідь, яку клієнт не прийме або не налаштований прийняти. Перш ніж зламати код на біти, переконайтеся, що WPAD не відтворюється, особливо, якщо це просто "почалося" невдало.



1

Перше, що ми намагалися - це відключити динамічне стиснення вмісту для IIS, що вирішило помилки, але помилка не була викликана стороною сервера, і це вплинуло лише на одного клієнта.

На стороні клієнта ми видалили VPN-клієнтів, скинули налаштування Інтернету та знову встановили VPN-клієнти. Помилка також може бути викликана попереднім антивірусом, який мав брандмауер. Тоді ми ввімкнули динамічне стиснення вмісту, і тепер він працює чудово, як і раніше.

Помилка з’явилася у користувацькому додатку, який підключається до веб-служби, а також у TFS.


0

У моєму випадку IIS не мав необхідних дозволів для доступу до відповідного шляху ASPX.

Я дав дозволи користувача IIS у відповідний каталог і все було добре.


0

Перегляньте свій код і знайдіть, чи встановлюєте ви якийсь заголовок з NULL або порожнім значенням.


0

Я почав отримувати цю помилку з моїх служб php JSON / REST

Я почав отримувати помилку від відносних рідкісних завантажень POST після того, як я додав ob_start("ob_gzhandler")до найчастіше доступного сценарію GET php

Я вмію користуватися просто ob_start(), і все добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.