2011-01-11 7 views
2

내가 www.mediafire.com에서 다운로드 페이지를 구문 분석하려고 해요를 사용하여 웹 페이지를 다운로드,하지만 난이 HtmlDocument에 페이지를로드 할 때 난 정말 종종 다음과 같은 메시지와 함께 System.Net.WebException을 얻을 때 :HTTP 프로토콜 위반 HtmlAgilityPack

서버가 프로토콜을 위반했습니다.

HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb(); 

HtmlAgilityPack.HtmlDocument doc = null; 

string url = www.mediafire.com/?abcdefghijkl //There are many different links 

try 
{ 
    doc = web.Load(url); //From 30 links, usually only 10 load properly 
} 

catch (WebException) 
{ 

} 

어떤 아이디어 왜 10 30 연결 작업 (내 프로그램에서 "검색 엔진"때문에 링크, 매번 변경)과 내가 어떻게 할 수 있습니다 제 = ResponseStatusLine

이 내 코드입니다 문제를 해결 하시겠습니까?

브라우저에서 해당 사이트를로드 할 때 모든 것이 올바르게 작동합니다.


나는 나의의 app.config에 다음 줄을 추가하려고했지만, 오히려에, 그것은 도움이되지 않습니다 중 하나

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

재정

MyWebClient client = new MyWebClient(); client.DownloadFile(searchURL, @"C:\\index.html"); var doc = web.Load("C:\\index.html"); 

. 'WebRequest'를 사용하여 브라우저와 비슷한 요청을 만들 수 있습니다. – alexn

+0

어쩌면 저에게 더 많은 정보를 제공해 줄 수 있습니까? 튜토리얼이나 다른 것에 대한 링크일까요? – Flagbug

답변

3

이 직접 HTML을 민첩성 팩 관련이 없습니다 기본 HTTP/소켓 레이어 이 오류는 서버가 올바른 HTTP 상태 라인을 보내지 않는다는 것을 의미합니다.

상태 라인이 여기에 해당 HTTP의 RFC에 정의되어 http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

나는 인용 :

응답 메시지 의 첫 번째 줄은 프로토콜 버전으로 구성, 다음 상태 라인이다 숫자 상태 코드 및 관련 텍스트 구로 구성되며 각 요소는 SP 문자로 구분됩니다. CR 또는 LF가 허용되지 않습니다. 최종 CRLF 순서는 예외입니다.

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF 

이를 확인하기 위해 전체 육각 보고서 소켓 흔적을 추가 할 수 있습니다 : 이것은 현재 실행 디렉토리에 SocketTrace.log 파일을 만듭니다

<configuration> 
    <system.diagnostics> 
     <sources> 
      <source name="System.Net.Sockets" tracemode="includehex"> 
       <listeners> 
        <add name="System.Net.Sockets" type="System.Diagnostics.TextWriterTraceListener" initializeData="SocketTrace.log" /> 
       </listeners> 
      </source> 
     </sources> 
     <switches> 
      <add name="System.Net.Sockets" value="Verbose"/> 
     </switches> 
     <trace autoflush="true" /> 
    </system.diagnostics> 
</configuration> 

. 거기에서 봐라, 프로토콜 위반이 보여야한다. 너무 크지 않은 경우 여기에 게시 할 수 있습니다 :-)

불행히도 서버를 소유하지 않으면 useUnsafeHeaderParsing 설정을 이미 추가 한 경우에도 수행 할 수있는 일은 많지 않지만 실패합니다. 이러한 경우 정상적으로.

+0

할 수있는 일은 서버 담당자에게 문의하여 문제를 알리는 것입니다. 그들에 따라 문제를 해결하기로 결정할 수도 있지만 Simon과 같이 서버를 제어 할 필요가없고 수정할 필요가 없다고 말합니다. – RobV

0

keep alive 속성을 false로 설정하면이 문제가 해결됩니다. 하지만 htmlagilitypack에이 속성이 있는지 확실하지 않습니다. 따라서 WebClient를 사용하는 것이 더 나은 대안이 될 것입니다.

이것은 나를 위해 일했습니다. web.Load로 URL을 직접로드하는 대신 사용자 정의 WebClient를 사용하여 원하는 URL의 html을 다운로드하십시오. 사용자 지정 WebClient에서 GetWebRequest 메서드를 재정 의하여 HttpWebRequest.KeepAlive = false로 만듭니다. 이제 다운로드 한 파일을 web.Load()에로드하십시오.그들은 아마 비 webbrowsers을 검출 스니핑 사용자 에이전트/쿠키/헤더를 사용하고 GetWebRequest

using System; 
using System.Net; 

namespace MyProject 
{ 
    internal class CustomWebClient : WebClient 
    { 
     protected override WebRequest GetWebRequest(Uri address) 
     { 
      WebRequest request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).KeepAlive = false; 
      } 
      return request; 
     } 
    } 
} 
+0

자신이 작업하고있는 서버가 KeepAlive 요청에 문제가 있거나 단순히 WebClient를 직접 사용하면 문제를 피할 수 있었습니까? 당신은 그의 문제가 무엇이라고 믿는 진술을 한 번도 진술하지 않았습니다. –

+0

예, 문제는 서버의 응답입니다. keep alive를 false로 설정하면이 문제가 해결됩니다. 하지만 htmlagilitypack 살아있는 속성을 유지하는 경우 잘 모르겠습니다. 따라서 WebClient를 사용하는 것이 더 나은 대안이 될 것입니다. 감사! – Shami