서버가 프로토콜 위반을 커밋했습니다. 섹션 = ResponseStatusLine 오류


115

프로그램을 만들고 사이트에 문자열을 게시하려고 시도했는데이 오류가 발생합니다.

"서버가 프로토콜 위반을 커밋했습니다. 섹션 = ResponseStatusLine"

이 코드 줄 뒤에 :

gResponse = (HttpWebResponse)gRequest.GetResponse(); 

이 예외를 어떻게 수정할 수 있습니까?

답변:


71

이것을 app / web.config에 넣으십시오.

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

이것이 작동하지 않으면 KeepAlive속성을 false로 설정할 수도 있습니다 .


3
이 오류를 발생시키는 6 개의 URL이 있습니다. useUnsafeHeaderParsing 하나 개의 링크를 고정 설정하지만, KeepAlive를 설정 = 거짓은 모든 6. 그것을 고정
데이비드 하몬드

3
웹이 아닌 응용 프로그램의 경우 App.copnfig의 <configuration> 루트 태그 내에 동일한 내용을 배치 할 수 있습니다 (예 : WPF 앱을 그렇게 수정했습니다. 감사합니다!).
Yury Schkatula 2013-08-20

이 안전 조치가 IIS에 의해 부과되는 이유를 아는 사람이 있습니까? 효과가 있었지만 헤더 값에 대한 제한 이유를 이해하지 못합니다 (제 경우에는 수동으로 설정).
emran 2014

26
이것은 실제로 문제를 해결하기보다는 단순히 문제를 피하는 것입니다. 이것이 기본 솔루션이 아니어야한다고 생각합니다.
Tobias

4
Tobias에 동의하십시오-당신은 문제를 피하고 있습니다. 이제 문제가 해결할 수없는 서버에있을 수 있으므로 회피가 유일한 선택 일 수 있습니다.하지만 프로토콜 오류를 피하는 것과 실제로 수정하는 것의 차이점에 대해 명확히하겠습니다.
metaforge 2014-06-13

58

때때로이 오류는 UserAgent요청 매개 변수가 비어 있을 때 발생합니다 (제 경우에는 github.com api에서).

이 매개 변수를 빈 문자열이 아닌 사용자 지정으로 설정하면 문제가 해결되었습니다.


5
아 이것이 내가 필요했던 것입니다. 감사. 다음은 사용자 에이전트의 예는 다음과 같습니다 stackoverflow.com/a/15144495/891976
데이비드 Ruhmann

WebClient여기 에서 사용할 빠른 줄 stackoverflow.com/a/11841680/4795214

5
감사. 수정을 위해 add : line을 통해 GitHub 를 쿼리하려는 경우 . HttpClientclient.DefaultRequestHeaders.Add("User-Agent", "Anything");
Cihan Yakar

32

제 경우의 범인은 No Content응답 을 반환 하지만 동시에 응답 본문을 정의하는 것이 었 습니다. 이 답변이 저와 다른 사람들 이 다시 는 몸 으로 응답 하지 않도록NoContent 상기 시키길 바랍니다.

이 동작은 다음과 같은 HTTP 사양10.2.5 204 내용 없음 과 일치합니다 .

204 응답은 메시지 본문을 포함하지 않아야하며 따라서 항상 헤더 필드 다음의 첫 번째 빈 줄로 종료됩니다.


The server committed a protocol violation. Section=ResponseStatusLine WebApi를 사용하여 기괴한 이유로 응답에 NoContent()전송 No Content된 사용자 지정 응답 을 반환 할 때 오류가 발생한 후에 이것을 읽으십시오 ! 내가 그것을
Intrepid

2
실패한 내용 없음 응답 후 호출이기 때문에 까다로 웠지만 이것은 또한 내 문제였습니다.
mdickin

제거하여 고정 someContent에서 return Request.CreateResponse(HttpStatusCode.NoContent, someContent);
snippetkid

12

또 다른 가능성 : POST를 수행 할 때 서버가 잘못된 방식으로 100 계속으로 응답합니다.

이것은 나를 위해 문제를 해결했습니다.

request.ServicePoint.Expect100Continue = false;

이것은 MediaFire API에 액세스 할 때 저에게 효과적이었습니다.
AlexPi

3
늦게 오는 건 알지만 "잘못된 방식"이란 무슨 뜻입니까?
kuskmen

1
HttpClient를 사용하는 모든 사람의 경우 다음이 저에게 var http = new HttpClient(); http.DefaultRequestHeaders.ExpectContinue = false;
효과적

9

이것은 내 로컬 컴퓨터에서 Skype를 실행했을 때 발생했습니다. 종료하자마자 예외가 사라졌습니다.

이 페이지의 아이디어 제공


같은 문제가있었습니다. Skype로 밝혀졌습니다. 안타깝게도 적절한 메시지를 제공 할 수 없습니다.
jordan koskei

실제로 Skype를 닫을 필요는 없습니다. Skype를 닫지 않고 해결하는 방법을 보여주기 위해 아래에 답변을 추가했습니다.
AltF4_

8

이를 디버깅하는 한 가지 방법 (문제를 일으키는 프로토콜 위반인지 확인)은 Fiddler (Http 웹 프록시)를 사용하여 동일한 오류가 발생하는지 확인하는 것입니다. 그렇지 않은 경우 (예 : Fiddler가 문제를 처리 한 경우) UseUnsafeHeaderParsing 플래그를 사용하여 문제를 해결할 수 있습니다.

이 값을 프로그래밍 방식으로 설정하는 방법을 찾고 있다면 여기에서 예제를 참조하십시오. http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline /


Fiddler는 실제로 GET HTTP 요청으로 발생한 문제를 해결하고 있습니다. 피들러가 무엇을하는지 볼 수 있습니까?
Olivier MATROT 2016

8

많은 솔루션이 해결 방법에 대해 이야기하지만 오류의 실제 원인에 대해서는 설명하지 않습니다.

이 오류의 한 가지 가능한 원인은 웹 서버가 헤더 응답 섹션을 출력하기 위해 ASCII또는 이외의 인코딩을 사용하는 경우 ISO-8859-1입니다. 사용하는 이유 는 확장 라틴 문자 ISO-8859-1Response-Phrase포함 된 경우 입니다.

이 오류의 또 다른 가능한 원인은 웹 서버가 UTF-8BOM (byte-order-marker)을 출력하는 것을 사용 하는 경우 입니다. 예를 들어, 기본 상수 Encoding.UTF8는 BOM을 출력하며이를 잊기 쉽습니다. 웹 페이지는 파이어 폭스와 크롬에서 제대로 작동하지만 HttpWebRequest폭탄을 터뜨릴 것입니다 :). 빠른 수정 출력 BOM, 예를 들어하지 않는 UTF-8 인코딩 사용하도록 웹 서버를 변경하는 것입니다 new UTF8Encoding(false)오랫동안 같이으로 OK입니다 ( Response-PhraseASCII 문자 만 포함,하지만 정말 사용해야 ASCII또는 ISO-8859-1헤더에 대한 다음 UTF-8또는 응답을위한 다른 인코딩).


이것이 최선의 응답입니다. 웹 서버가 오작동하는 이유를 설명합니다. 감사! (I 때문에 HTTP Listener에와 배포 문제의 소켓을 가진 웹 서버를 에뮬레이션합니다.)
앤드류 론도

6

100을 계속해서 false로 설정하고 소켓 유휴 시간을 2 초로 줄이면 문제가 해결되었습니다.

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

6

Skype가 내 문제의 주요 원인이었습니다.

이 오류는 일반적으로 기본 제공 ASP.NET 디버그 웹 서버가 아닌 IIS에서 실행중인 기존 웹 응용 프로그램을 디버깅하도록 Visual Studio를 설정 한 경우에 발생 합니다. IIS는 기본적으로 포트 80에서 웹 요청을 수신합니다.이 경우 다른 응용 프로그램은 이미 포트 80에서 요청을 수신하고 있습니다. 일반적으로 문제가되는 응용 프로그램은 Skype이며 설치시 기본적으로 포트 80 및 443에서 수신 대기합니다. Skype는 이미 포트 80을 사용하고 있습니다. 따라서 IIS를 시작할 수 없습니다.

문제를 해결하려면 다음 단계를 따르십시오.

Skype-> 도구-> 옵션-> 고급-> 연결 :

"수신 연결에 대한 대안으로 포트 80 및 443 사용"을 선택 취소합니다.

그리고 아래에서 지적했듯이 IIS 재설정 을 수행하십시오.


2
그렇게함으로써 후 IIS를 다시 시작 기억
아메드 갈랄에게

3

프록시 뒤에서 Last.fm Rest API에 액세스하려고했는데이 유명한 오류가 발생했습니다.

서버가 프로토콜 위반을 커밋했습니다. Section = ResponseStatusLine

몇 가지 해결 방법을 시도한 후이 두 가지만 나를 위해 일했습니다.

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

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

2

어떤 솔루션도 나를 위해 일하지 않았으므로 HttpWebRequest 대신 WebClient를 사용해야했고 문제는 더 이상 없었습니다.

나는 CookieContainer를 사용해야했기 때문에이 스레드에서 Pavel Savara가 게시 한 솔루션을 사용했습니다. WebClient 클래스와 함께 CookieContainer 사용

이 줄에서 "protected"를 제거하십시오.

개인 읽기 전용 CookieContainer 컨테이너 = new CookieContainer ();


2

이 문제의 가능한 원인은 네트워크의 WPAD (Web Proxy Auto Discovery Protocol) 구성입니다. HTTP 요청은 클라이언트가 수락하지 않거나 수락하도록 구성되지 않은 응답을 다시 보낼 수있는 프록시로 투명하게 전송됩니다. 코드를 비트로 해킹하기 전에 WPAD가 작동하지 않는지 확인하십시오. 특히 이것이 갑자기 "시작된"경우에는 더욱 그렇습니다.


2

내 문제는 내가라는 것이 었습니다 https으로 엔드 포인트를 http.


1

가장 먼저 시도한 것은 IIS에 대한 동적 콘텐츠 압축을 비활성화하는 것이 었는데, 이로 인해 오류가 해결되었지만 오류는 서버 측에서 발생하지 않았으며 단 하나의 클라이언트 만 영향을 받았습니다.

클라이언트 측에서 VPN 클라이언트를 제거하고 인터넷 설정을 재설정 한 다음 VPN 클라이언트를 다시 설치했습니다. 방화벽이있는 이전 바이러스 백신으로 인해 오류가 발생할 수도 있습니다. 그런 다음 동적 콘텐츠 압축을 다시 활성화했으며 이제 이전과 같이 잘 작동합니다.

웹 서비스 및 TFS에 연결하는 사용자 지정 응용 프로그램에 오류가 나타났습니다.


0

제 경우에는 IIS에 관련 ASPX 경로에 액세스하는 데 필요한 권한이 없었습니다.

IIS 사용자에게 관련 디렉토리에 대한 권한을 부여했고 모든 것이 잘되었습니다.


0

코드를보고 NULL 또는 빈 값으로 헤더를 설정하고 있는지 확인하십시오.


0

내 PHP JSON / REST 서비스에서이 오류가 발생하기 시작했습니다.

ob_start("ob_gzhandler")가장 자주 액세스하는 GET PHP 스크립트에 추가 한 후 relativley 희귀 POST 업로드에서 오류가 발생하기 시작했습니다.

나는 단지을 사용할 수 ob_start()있으며 모든 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.