HtmlAgilityPack을 사용하여 웹 페이지를 다운로드 할 때 HTTP 프로토콜 위반

.net c# html-agility-pack system.net.webexception

문제

www.mediafire.com에서 다운로드 페이지를 구문 분석하려고하지만 HtmlDocument 페이지를로드하려고하면 다음 메시지와 함께 System.Net.WebException 이 발생합니다.

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

이것은 내 코드입니다.

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)
{

}

30 개의 링크 중 10 개만 작동하는 아이디어 (내 프로그램이 "검색 엔진"이기 때문에 매번 링크가 변경됨)와 문제를 해결할 수있는 방법은 무엇입니까?

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


내 app.config 파일에 다음 행을 추가하려고 시도했지만 도움이되지 않습니다.

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)
{

}

수락 된 답변

이것은 Html Agility Pack과 직접 관련이 없으며 기본 HTTP / 소켓 계층과 관련이 있습니다. 이 오류는 서버가 올바른 HTTP 상태 라인을 보내지 않는다는 것을 의미합니다.

상태 표시 줄은 HTTP RFC에 정의되어 있습니다. http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html

나는 인용한다 :

응답 메시지의 첫 번째 줄은 프로토콜 버전과 숫자 상태 코드 및 관련 텍스트 구로 구성되며 각 요소는 SP 문자로 구분 된 상태 줄입니다. 최종 CRLF 순서를 제외하고 CR 또는 LF는 허용되지 않습니다.

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

전체 16 진수 보고서와 함께 소켓 추적을 추가하여이를 확인할 수 있습니다.

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

그러면 현재 실행중인 디렉터리에 SocketTrace.log 파일이 만들어집니다. 거기에서 봐라, 프로토콜 위반이 보여야한다. 너무 크지 않으면 여기에 게시 할 수 있습니다 :-)

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


인기 답변

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

이것은 나를 위해 일했다. 직접 web.Load로 URL을로드하는 대신 사용자 정의 WebClient를 사용하여 원하는 URL의 html을 다운로드하십시오. 사용자 지정 WebClient에서 GetWebRequest 메서드를 재정 의하여 HttpWebRequest.KeepAlive = false로 만듭니다. 이제 다운로드 한 파일을 web.Load ()에로드하십시오.

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

GetWebRequest 무시

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



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.