Serwer popełnił naruszenie protokołu. Sekcja = ResponseStatusLine ERROR


115

Utworzyłem program, próbowałem zamieścić ciąg na stronie i otrzymuję ten błąd:

„Serwer popełnił naruszenie protokołu. Section = ResponseStatusLine”

po tym wierszu kodu:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

Jak mogę naprawić ten wyjątek?

Odpowiedzi:


71

Spróbuj umieścić to w swojej aplikacji / web.config:

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

Jeśli to nie zadziała, możesz również spróbować ustawić KeepAlivewłaściwość na false.


3
Miałem 6 adresów URL rzucających ten błąd. Ustawienie useUnsafeHeaderParsing naprawiło to dla jednego łącza, ale ustawienie KeepAlive = false naprawiło to dla wszystkich 6.
David Hammond,

3
To samo można umieścić w tagu głównym <configuration> w App.copnfig dla aplikacji innych niż internetowe (na przykład naprawiłem w ten sposób aplikację WPF - dzięki!).
Yury Schkatula

ktoś wie, dlaczego ten środek bezpieczeństwa jest nakładany przez IIS? Zadziałało, ale nie rozumiem powodu ograniczenia wartości nagłówka (ręczne ustawienie ich w moim przypadku).
emran

26
Ma to na celu jedynie uniknięcie problemu, a nie jego naprawę. Myślę, że nie powinno to być domyślne rozwiązanie.
Tobias

4
Zgadzam się z Tobiaszem - unikasz problemu. Może się zdarzyć, że problem występuje na serwerze, którego nie możesz naprawić, a zatem unikanie może być jedyną opcją ... ale mimo to wyjaśnijmy różnicę między unikaniem błędu protokołu a jego naprawą.
metaforge

58

Czasami ten błąd występuje, gdy UserAgentparametr żądania jest pusty (w moim przypadku w interfejsie API github.com).

Ustawienie tego parametru na niestandardowy niepusty ciąg rozwiązało mój problem.


5
Ach, tego potrzebowałem. Dzięki. Oto przykład
klienta

Szybka linia do użycia WebClienttutaj stackoverflow.com/a/11841680/4795214

5
Dzięki. Jeśli chcesz zapytać GitHub za pomocą HttpClient add: client.DefaultRequestHeaders.Add("User-Agent", "Anything"); line for fix.
Cihan Yakar

32

W moim przypadku winowajcą było zwrócenie No Contentodpowiedzi, ale zdefiniowanie treści odpowiedzi w tym samym czasie. Niech ta odpowiedź przypomni mi i może innym, abyNoContent nigdy więcej nie odpowiadali z ciałem .

To zachowanie jest zgodne z 10.2.5 204 bez zawartości w specyfikacji HTTP , który mówi:

Odpowiedź 204 NIE MOŻE zawierać treści wiadomości i dlatego jest zawsze zakończona pierwszą pustą linią po polach nagłówka.


Po prostu przeczytaj to po tym, jak The server committed a protocol violation. Section=ResponseStatusLine wystąpił błąd podczas używania WebApi do zwrócenia niestandardowej NoContent()odpowiedzi, która była wysyłana No Contentw odpowiedzi z jakiegoś dziwnego powodu! Kiedy to wyjęłam, problem zniknął :)
Intrepid

2
To też był mój problem, chociaż był trudny, ponieważ zawiodło wywołanie PO odpowiedzi na brak treści.
mdickin

Naprawiono przez usunięcie someContentz return Request.CreateResponse(HttpStatusCode.NoContent, someContent); +1
snippetkid

12

Inna możliwość: podczas wykonywania POST serwer odpowiada 100 kontynuuj w nieprawidłowy sposób.

To rozwiązało problem dla mnie:

request.ServicePoint.Expect100Continue = false;

To zadziałało podczas uzyskiwania dostępu do API MediaFire.
AlexPi,

3
Wiem, że się spóźniam, ale co masz na myśli mówiąc „w niewłaściwy sposób”?
kuskmen

1
Dla każdego, kto używa HttpClient , zadziałało dla mnie:var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
user2444499

9

To się działo, gdy miałem Skype'a na moim komputerze lokalnym. Jak tylko zamknąłem, wyjątek zniknął.

Pomysł dzięki uprzejmości tej strony


Miał ten sam problem. Okazało się, że to Skype. Jest to tak niefortunne, że nie można dostarczyć odpowiednich komunikatów.
jordan koskei

w rzeczywistości nie musisz zamykać Skype'a, dodałem odpowiedź poniżej, aby pokazać, jak sobie z tym poradzić bez zamykania Skype.
AltF4_

8

Jednym ze sposobów debugowania tego (i upewnienia się, że przyczyną problemu jest naruszenie protokołu), jest użycie programu Fiddler (serwer proxy sieci Web Http) i sprawdzenie, czy występuje ten sam błąd. Jeśli tak się nie stanie (tj. Fiddler załatwił problem za Ciebie), powinieneś być w stanie go naprawić za pomocą flagi UseUnsafeHeaderParsing.

Jeśli szukasz sposobu na programowe ustawienie tej wartości, zapoznaj się z przykładami tutaj: http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /


Fiddler rzeczywiście naprawia problem, który mam z żądaniem GET HTTP. Czy możemy zobaczyć, co robi skrzypek?
Olivier MATROT

8

Wiele rozwiązań mówi o obejściu, ale nie o rzeczywistej przyczynie błędu.

Jedną z możliwych przyczyn tego błędu jest to, że serwer WWW używa kodowania innego niż ASCIIlub ISO-8859-1do wyprowadzenia sekcji odpowiedzi nagłówka. Powodem ISO-8859-1byłoby użycie Response-Phraserozszerzonych znaków łacińskich.

Inną możliwą przyczyną tego błędu jest to, że serwer WWW używa, UTF-8który generuje znacznik kolejności bajtów (BOM). Na przykład, domyślna stała Encoding.UTF8wyprowadza BOM i łatwo o tym zapomnieć. Strony internetowe będą działać poprawnie w Firefoksie i Chrome, ale HttpWebRequestbędą bombardować :). Szybką naprawą jest zmiana serwera WWW, aby używał kodowania UTF-8, które nie generuje BOM, np. new UTF8Encoding(false)(Co jest OK, o ile Response-Phrasetylko zawiera znaki ASCII, ale tak naprawdę powinno używać ASCIIlub ISO-8859-1dla nagłówków, a następnie UTF-8lub inne kodowanie odpowiedzi).


To najlepsza odpowiedź. Wyjaśnia, dlaczego serwer sieciowy działa nieprawidłowo. Dzięki! (Muszę emulować serwer sieciowy z gniazdami z powodu problemów z wdrażaniem z HttpListener.)
Andrew Rondeau

6

Ustawienie oczekiwania 100 nadal na fałsz i zmniejszenie czasu bezczynności gniazda do dwóch sekund rozwiązało problem

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

6

Skype był główną przyczyną mojego problemu:

Ten błąd zwykle występuje, gdy program Visual Studio jest skonfigurowany do debugowania istniejącej aplikacji internetowej działającej w usługach IIS, a nie wbudowanego serwera sieci Web debugowania ASP.NET . Usługi IIS domyślnie nasłuchują żądań sieci Web na porcie 80. W tym przypadku inna aplikacja nasłuchuje już żądań na porcie 80. Zazwyczaj problematyczną aplikacją jest Skype, który domyślnie przejmuje nasłuchiwanie na portach 80 i 443 po zainstalowaniu. Skype zajmuje już port 80. Dlatego IIS nie może się uruchomić.

Aby rozwiązać ten problem, wykonaj następujące czynności:

Skype -> Narzędzia -> Opcje -> Zaawansowane -> Połączenie:

Usuń zaznaczenie opcji „Użyj portów 80 i 443 jako alternatyw dla połączeń przychodzących”.

Jak wskazano poniżej, po wykonaniu resetowania usług IIS .


2
i pamiętaj, aby ponownie uruchomić IIS po wykonaniu tej czynności
Ahmed Galal

3

Próbowałem uzyskać dostęp do Last.fm Rest API zza serwera proxy i otrzymałem ten słynny błąd.

Serwer popełnił naruszenie protokołu. Sekcja = ResponseStatusLine

Po wypróbowaniu kilku obejść, tylko te dwa działały dla mnie

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

i

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

2

Żadne z rozwiązań nie działało dla mnie, więc musiałem użyć WebClient zamiast HttpWebRequest i problem już nie istniał.

Potrzebowałem użyć CookieContainer, więc skorzystałem z rozwiązania zamieszczonego przez Pavela Savarę w tym wątku - Używanie CookieContainer z klasą WebClient

po prostu usuń „chroniony” z tej linii:

prywatny kontener CookieContainer tylko do odczytu = new CookieContainer ();


2

Prawdopodobną przyczyną tego problemu jest konfiguracja protokołu Web Proxy Auto Discovery Protocol (WPAD) w sieci. Żądanie HTTP zostanie wysłane w sposób przezroczysty do serwera proxy, który może odesłać odpowiedź, której klient nie zaakceptuje lub nie jest skonfigurowany do akceptowania. Przed zhakowaniem kodu na bity sprawdź, czy WPAD nie jest w grze, szczególnie jeśli to „zaczęło się dziać” niespodziewanie.


2

Mój problem polegał na tym, że zadzwoniłem do httpspunktu końcowego z http.


1

Pierwszą rzeczą, którą próbowaliśmy, było wyłączenie dynamicznej kompresji treści dla IIS, co rozwiązało błędy, ale błąd nie był spowodowany po stronie serwera i dotyczyło to tylko jednego klienta.

Po stronie klienta odinstalowaliśmy klientów VPN, zresetowaliśmy ustawienia internetowe, a następnie ponownie zainstalowaliśmy klientów VPN. Błąd mógł być również spowodowany przez poprzedni program antywirusowy z zaporą ogniową. Następnie włączyliśmy z powrotem dynamiczną kompresję treści i teraz działa dobrze jak poprzednio.

Wystąpił błąd w niestandardowej aplikacji, która łączy się z usługą internetową, a także w TFS.


0

W moim przypadku IIS nie miał niezbędnych uprawnień dostępu do odpowiedniej ścieżki ASPX.

Dałem użytkownikowi IIS uprawnienia do odpowiedniego katalogu i wszystko poszło dobrze.


0

Zobacz swój kod i sprawdź, czy ustawiasz nagłówek z wartością NULL lub pustą.


0

Zacząłem otrzymywać ten błąd z moich usług php JSON / REST

Zacząłem otrzymywać błąd z relativley rzadkich przesyłania POST po dodaniu ob_start("ob_gzhandler")do najczęściej używanego skryptu GET php

Potrafię używać tylko ob_start()i wszystko jest w porządku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.