Der Server hat eine Protokollverletzung begangen. Section = ResponseStatusLine ERROR

115

Ich habe ein Programm erstellt, versucht, eine Zeichenfolge auf einer Site zu veröffentlichen, und erhalte folgende Fehlermeldung:

"Der Server hat eine Protokollverletzung begangen. Section = ResponseStatusLine"

nach dieser Codezeile:

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

Wie kann ich diese Ausnahme beheben?

manish patel
quelle

Antworten:

70

Versuchen Sie dies in Ihre App / web.config einzufügen:

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

Wenn dies nicht funktioniert, können Sie auch versuchen, die KeepAliveEigenschaft auf false zu setzen.

Darin Dimitrov
quelle
3
Ich hatte 6 URLs, die diesen Fehler auslösten. Das Setzen von useUnsafeHeaderParsing hat es für einen Link behoben, aber das Setzen von KeepAlive = false hat es für alle 6 behoben.
David Hammond
3
Dasselbe kann für Nicht-Webanwendungen im Root-Tag <configuration> in der App.copnfig abgelegt werden (zum Beispiel habe ich die WPF-App auf diese Weise repariert - danke!).
Yury Schkatula
Weiß jemand, warum diese Sicherheitsmaßnahme von IIS auferlegt wird? Es hat funktioniert, aber ich verstehe den Grund für die Einschränkung der Header-Werte nicht (in meinem Fall manuell festlegen).
emran
26
Dies vermeidet lediglich das Problem, anstatt es tatsächlich zu beheben. Ich denke, dies sollte nicht die Standardlösung sein.
Tobias
4
Stimmen Sie mit Tobias überein - Sie vermeiden das Problem. Jetzt kann es sein, dass das Problem auf einem Server liegt, den Sie nicht beheben können, und daher kann die Vermeidung Ihre einzige Option sein. Lassen Sie uns jedoch den Unterschied zwischen der Vermeidung eines Protokollfehlers und der tatsächlichen Behebung klarstellen.
Metaforge
58

Manchmal tritt dieser Fehler auf, wenn der UserAgentAnforderungsparameter leer ist (in meinem Fall in github.com api).

Das Setzen dieses Parameters auf eine benutzerdefinierte, nicht leere Zeichenfolge hat mein Problem gelöst.

Ivan Kochurkin
quelle
5
Ah das ist was ich brauchte. Vielen Dank. Hier ist ein User-Agent-Beispiel: stackoverflow.com/a/15144495/891976
David Ruhmann
Eine kurze Zeile zur Verwendung mit WebClienthier stackoverflow.com/a/11841680/4795214
5
Vielen Dank. Wenn Sie GitHub über HttpClient add: client.DefaultRequestHeaders.Add("User-Agent", "Anything"); line für fix abfragen möchten .
Cihan Yakar
32

Der Schuldige in meinem Fall war die Rückgabe einer No ContentAntwort, aber gleichzeitig die Definition eines Antwortkörpers. Möge diese Antwort mich und vielleicht andere daran erinnern, nie wieder eine NoContentAntwort mit einem Körper zu erwidern .

Dieses Verhalten steht im Einklang mit 10.2.5 204 No Content der HTTP-Spezifikation, in der Folgendes angegeben ist :

Die Antwort 204 darf keinen Nachrichtentext enthalten und wird daher immer durch die erste leere Zeile nach den Headerfeldern beendet.

Tobias
quelle
Lesen Sie dies einfach, nachdem ich den The server committed a protocol violation. Section=ResponseStatusLine Fehler bei der Verwendung von WebApi erhalten habe, um eine benutzerdefinierte NoContent()Antwort zurückzugeben, die No Contentdie Antwort aus irgendeinem bizarren Grund gesendet hat ! Einmal nahm ich , dass aus das Problem ging :) weg
Intrepid
2
Dies war auch mein Problem, obwohl es schwierig war, weil der Anruf NACH der Antwort "Kein Inhalt" fehlschlug.
Mdickin
someContentreturn Request.CreateResponse(HttpStatusCode.NoContent, someContent);
Behoben
11

Eine andere Möglichkeit: Wenn Sie einen POST ausführen, antwortet der Server mit einer 100-fachen Fortsetzung auf falsche Weise.

Dies löste das Problem für mich:

request.ServicePoint.Expect100Continue = false;
marq
quelle
Dies hat bei mir beim Zugriff auf die MediaFire-API funktioniert.
AlexPi
3
Ich weiß, dass ich zu spät komme, aber was meinst du mit "falsch"?
Kuskmen
1
Für jeden, der HttpClient verwendet , funktionierte Folgendes für mich:var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
user2444499
9

Dies geschah für mich, als Skype auf meinem lokalen Computer ausgeführt wurde. Sobald ich schloss, dass die Ausnahme wegging.

Idee mit freundlicher Genehmigung dieser Seite

Luke
quelle
Hatte das gleiche Problem. Es stellte sich heraus, dass es sich um Skype handelte. Es ist so bedauerlich, dass keine richtigen Nachrichten bereitgestellt werden können.
Jordan Koskei
Sie müssen Skype nicht wirklich schließen. Ich habe unten eine Antwort hinzugefügt, um zu zeigen, wie Sie es angehen können, ohne Skype zu schließen.
AltF4_
8

Eine Möglichkeit, dies zu debuggen (und sicherzustellen, dass es sich um die Protokollverletzung handelt, die das Problem verursacht), besteht darin, Fiddler (HTTP-Webproxy) zu verwenden und festzustellen, ob der gleiche Fehler auftritt. Wenn dies nicht der Fall ist (dh Fiddler hat das Problem für Sie behandelt), sollten Sie es mithilfe des UseUnsafeHeaderParsing-Flags beheben können.

Wenn Sie nach einer Möglichkeit suchen, diesen Wert programmgesteuert festzulegen, sehen Sie sich die folgenden Beispiele an: http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /.

Dinis Cruz
quelle
Fiddler behebt tatsächlich das Problem, das ich mit einer GET HTTP-Anfrage habe. Können wir sehen, was der Geiger tut?
Olivier MATROT
8

Viele Lösungen sprechen von einer Problemumgehung, aber nicht von der tatsächlichen Fehlerursache.

Eine mögliche Ursache für diesen Fehler ist, dass der Webserver eine andere Codierung als ASCIIoder ISO-8859-1zur Ausgabe des Header-Antwortabschnitts verwendet. Der Grund für die Verwendung ISO-8859-1wäre, wenn das Response-Phraseerweiterte lateinische Zeichen enthält.

Eine weitere mögliche Ursache für diesen Fehler ist die Verwendung eines Webservers UTF-8, der den Byte-Order-Marker (BOM) ausgibt. Beispielsweise gibt die Standardkonstante Encoding.UTF8die Stückliste aus, und dies kann leicht vergessen werden. Die Webseiten funktionieren in Firefox und Chrome korrekt, HttpWebRequestbombardieren aber :). Eine schnelle Lösung besteht darin, den Webserver so zu ändern, dass die UTF-8-Codierung verwendet wird, die die Stückliste nicht ausgibt, z. B. new UTF8Encoding(false)(was in Ordnung ist, solange das Response-Phrasenur ASCII-Zeichen enthält, aber eigentlich sollte es ASCIIoder ISO-8859-1für die Header verwenden, und dann UTF-8oder eine andere Codierung für die Antwort).

Abscheu
quelle
Dies ist die beste Antwort. Es erklärt, warum sich der Webserver schlecht verhält. Vielen Dank! (Ich muss einen Webserver mit Sockets wegen Bereitstellungsproblemen mit HttpListener emulieren.)
Andrew Rondeau
6

Das Einstellen von "Erwarten 100" ist weiterhin falsch und das Reduzieren der Leerlaufzeit des Sockets auf zwei Sekunden hat das Problem für mich behoben

ServicePointManager.Expect100Continue = false; 
ServicePointManager. MaxServicePointIdleTime = 2000; 
Prashan Pratap
quelle
6

Skype war die Hauptursache für mein Problem:

Dieser Fehler tritt normalerweise auf, wenn Sie Visual Studio so eingerichtet haben, dass eine vorhandene Webanwendung debuggt, die in IIS und nicht in ASP.NET ausgeführt wird Debug-Webserver debuggt. IIS wartet standardmäßig auf Webanforderungen an Port 80. In diesem Fall wartet eine andere Anwendung bereits auf Anforderungen an Port 80. In der Regel handelt es sich bei der fehlerhaften Anwendung um Skype, das bei der Installation standardmäßig die Überwachung der Ports 80 und 443 übernimmt. Skype belegt bereits den Port 80. Daher kann IIS nicht gestartet werden.

Führen Sie die folgenden Schritte aus, um das Problem zu beheben:

Skype -> Extras -> Optionen -> Erweitert -> Verbindung:

Deaktivieren Sie "Port 80 und 443 als Alternative für eingehende Verbindungen verwenden".

Und wie unten ausgeführt, führen Sie nach Abschluss einen IIS-Reset durch .

AltF4_
quelle
2
und denken Sie daran, IIS danach neu zu starten
Ahmed Galal
3

Ich habe versucht, hinter einem Proxy auf die Last.fm Rest-API zuzugreifen, und habe diesen berühmten Fehler erhalten.

Der Server hat eine Protokollverletzung begangen. Section = ResponseStatusLine

Nachdem ich einige Problemumgehungen ausprobiert hatte, arbeiteten nur diese beiden für mich

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

und

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

Keine der Lösungen funktionierte für mich, daher musste ich einen WebClient anstelle eines HttpWebRequest verwenden, und das Problem trat nicht mehr auf.

Ich musste einen CookieContainer verwenden, daher habe ich die von Pavel Savara in diesem Thread veröffentlichte Lösung verwendet - Verwenden von CookieContainer mit der WebClient-Klasse

Entfernen Sie einfach "protected" aus dieser Zeile:

privater schreibgeschützter CookieContainer-Container = neuer CookieContainer ();

TH Todorov
quelle
2

Eine wahrscheinliche Ursache für dieses Problem ist die WPAD-Konfiguration (Web Proxy Auto Discovery Protocol) im Netzwerk. Die HTTP-Anforderung wird transparent an einen Proxy gesendet, der eine Antwort zurücksenden kann, die der Client nicht akzeptiert oder für deren Annahme er nicht konfiguriert ist. Bevor Sie Ihren Code in Bits hacken, überprüfen Sie, ob WPAD nicht im Spiel ist, insbesondere wenn dies gerade aus heiterem Himmel "passiert" ist.

Skrymsli
quelle
2

Mein Problem war, dass ich httpsEndpoint mit angerufen habe http.

gnerisch
quelle
1

Als erstes haben wir versucht, die dynamische Inhaltskomprimierung für IIS zu deaktivieren. Dadurch wurden die Fehler behoben, aber der Fehler wurde nicht serverseitig verursacht, und nur ein Client war davon betroffen.

Auf der Clientseite haben wir VPN-Clients deinstalliert, die Interneteinstellungen zurückgesetzt und dann die VPN-Clients neu installiert. Der Fehler kann auch durch frühere Antivirenprogramme mit Firewall verursacht werden. Dann haben wir die dynamische Inhaltskomprimierung wieder aktiviert und jetzt funktioniert es einwandfrei wie zuvor.

In der benutzerdefinierten Anwendung, die eine Verbindung zu einem Webdienst herstellt, und auch bei TFS ist ein Fehler aufgetreten.

HasanG
quelle
0

In meinem Fall verfügte der IIS nicht über die erforderlichen Berechtigungen für den Zugriff auf den entsprechenden ASPX-Pfad.

Ich habe den IIS-Benutzerberechtigungen für das entsprechende Verzeichnis erteilt, und alles war in Ordnung.

Vaiden
quelle
0

Sehen Sie sich Ihren Code an und finden Sie heraus, ob Sie einen Header mit NULL oder einem leeren Wert setzen.

Abdul Rauf
quelle
0

Ich bekam diesen Fehler von meinen PHP JSON / REST-Diensten

Ich bekam den Fehler von relativ seltenen POST-Uploads, nachdem ich ob_start("ob_gzhandler")das am häufigsten aufgerufene GET-PHP-Skript hinzugefügt hatte

Ich kann nur verwenden ob_start(), und alles ist in Ordnung.

Patrick
quelle