2012-01-09 3 views
3

HttpWebRequest/HttpWebResponse 개체를 통해 웹 사이트에 요청하고 있습니다.HttpWebResponse.GetResponse() fiddler가 "응답 헤더 구문 분석에 실패했습니다"라고 말합니다.

웹 사이트를 여러 번 성공적으로 호출하면 동일한 동적 페이지에 대한 호출이 모두 실패합니다. 디버거에서

나는 "내부 서버 오류 500"을 받고 있어요 피들러는 500 응답을 보여줍니다 포함 : 나는 모든 진수를 제거하고 페이지를 열어 본

[Fiddler] Response Header parsing failed. 
This can be caused by an illegal HTTP response earlier on this reused server socket--  for instance, a HTTP/304 response which illegally contains a body. 
Response Data: 
<plaintext> 
0D 0A 3C 21 44 4F 43 54 59 50 45 20 48 54 4D 4C 20 50 55 42 4C 49 43 20 ..<!DOCTYPE  HTML PUBLIC 
22 2D 2F 2F 57 33 43 2F 2F 44 54 44 20 48 54 4D 4C 20 34 2E 30 20 54 72 "-//W3C//DTD HTML 4.0 Tr 
61 6E 73 69 74 69 6F 6E 61 6C 2F 2F 45 4E 22 3E 0D 0A 3C 48 54 4D 4C 3E ansitional//EN">..<HTML> 
0D 0A 09 3C 48 45 41 44 3E 0D 0A 09 09 3C 74 69 74 6C 65 3E 56 69 65 77 ...<HEAD>....<title>View 

내가 기대하는 것입니다 어떤 이유로 서버가 500을보고하고 HttpWebRequest 객체가이 예외를 throw합니다.

나는이 문제에 대해 다른 모든 "수정 사항"을 시도했지만 작동하지 않습니다. 그것은 단지 서버로부터 보내지는 잘못된 데이터일지도 모르지만, 피타가 아닌 HttpWebRequest보다 낮은 레벨의 객체를 사용할 것인가?

편집 : 위 예제에서 전체 16 진수/전체 HTML 블록을 포함하지 않았습니다.
편집 : 피들러 끄기 내가 디버거에서이 얻을

편집 : 그래서, 내가 본 것을에서 HttpWebResponse 클래스 객체가 그에 따라 행동한다. 서버가 비정상적이며 때로는 다른 http 상태 코드로 동일한 정확한 데이터를 반환합니다. 빠른 수정을 위해 방금 try/catch에서 각 호출을 래핑하고 catch 블록에서 정확히 동일한 호출을 다시 시도합니다. 지금까지는 HttpWebResponse 객체가 아니라 사이트 오류라고 반증합니다.

The server committed a protocol violation. Section=ResponseStatusLine 
+1

당신이 공격하려는 웹 사이트를 제어 할 수 있습니까? –

+0

@ M.Babcock 아닙니다. 지금까지 500 응답에서 html을 제거하고 구문 분석 할 수있는 것처럼 보였지만 악취가 난다. – user1231231412

+0

@Amadan winforms 앱입니다. – user1231231412

답변

0

헤이 존을

은인가 피 들러없이 같은 결과? (그냥 화면에 예외를 인쇄). 나는 때때로 디버거의 행동에 어려움을 겪었다.

서버가 간헐적 인 오류를 반환하고 제어 할 권한이없는 경우 많은 일을 할 수 없습니다. 이 메시지는 304에 대한 표준 인 것으로 보입니다. 응답에는 본문이 없어야하지만 서버는 원하는대로 수행 할 수 있기 때문에 해결해야 할 문제가 많습니다.

참조 W3C : 클라이언트가 조건부 GET 요청을 수행하고 액세스가 허용 이지만, 문서가 수정되지 않은 http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

경우, 서버는이 상태 코드로 응답해야한다. 304 응답은 메시지 본문을 포함해서는 안되며 따라서 항상 헤더 필드 다음의 첫 번째 빈 줄로 종료됩니다.

HttpWebRequest와 관련해서는 전혀 문제가 없었으며 HTTP 통신을 처리 할 수없는 경우는 전혀 들어 보지 못했습니다. 그러나 케이스가 너트하고 직접 패킷을 처리하려는 경우 Google은 소켓을 사용하여 HttpWebRequest를 직접 구축하는 방법을 알고 있습니다.

이 프로젝트는 시작이 될 수 : http://www.codeproject.com/Articles/13486/A-Simple-Crawler-Using-C-Sockets

+0

링크를 제공해 주셔서 감사합니다. 좋은 프로젝트처럼 보입니다. – user1231231412

1

HTTP 304 응답은 페이지를 마지막으로 방문한 이후로 페이지 콘텐츠가 변경되지 않았 음을 의미합니다 (캐싱 사용 가능성이 높음). 이 오류가 발생하면 페이지를 적게 누르거나 응답을 캐시하십시오.

EDIT

서버에 데이터가 유효하지 않은 (304) 응답을 전송한다. 이것은 HTTP 스펙을 위반하고 HttpWebResponse/Fiddler는이를 유효하게 500으로 변환합니다. 당신이 당신의 app.config에 다음과 같은 설정을 사용하는 경우

편집는 당신은 HttpWebRequest/HttpWebResponse를 계속 사용 할 수 있습니다

:

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

첫 번째 페이지에서 나는 다운로드 할 파일에 대한 링크를 몇 개 모으고 있습니다. 그 다음에 사이트에 도달 할 때마다 동일한 "다운로드"url이 있지만 다른 querystring 매개 변수가 사용됩니다. 나는 그것이 캐싱을 막을 것이라고 생각할 것이다. 그러나 이것은 특정 구성을 위해서만있을 수있다. – user1231231412

+0

그것은 캐싱 시스템의 정교함에 달려 있습니다. 잘못된 HTTP 응답을 생성하는 것은 아닙니다. –

+0

그것은. NET 1.1 사이트이고 잘못된 형식의 HTML을 가지고 있습니다. :) – user1231231412