httpwebrequest를 사용하여 html 페이지를 다운로드하여 contentlength를 -1로 반환합니다.

StackOverflow https://stackoverflow.com/questions/961383

문제

인터넷에서 다운로드 한 HTML 파일을 많이 얻고 HTTPWebRequest를 사용하여 수행하려고합니다.

그러나 내가 사용할 때

WebRequest.create ( "http://www.stackoverflow.com/"); webRequest.getResponse ();

httpwebresponse.contentlength는 항상 -1입니다. 이 페이지 다운로드의 진행 상황을 보여 주어야합니다. 기존 VB6 버전에서 INET 컨트롤을 사용하고 있으며 진행 상황을 잘보고합니다.

내 코드는 이것과 매우 유사합니다.

http://www.geekpedia.com/tutorial179_creating-adownload-manager-in-csharp.html

( '다운로드'방법)

내가 무엇을 잘못하고 있는지 또는 정상적인 지 여부는 확실하지 않습니다. 웹-서버가 보낸 콘텐츠 길이 헤더가 없습니다. 이 경우 진행 상황을 어떻게 운동합니까?

감사,

도움이 되었습니까?

해결책

다음은 사용하는 샘플입니다 웹 클라이언트 당신은 시도 할 수 있습니다 :

class Program
{
    static void Main(string[] args)
    {
        var client = new WebClient();
        client.DownloadProgressChanged += (sender, e) =>
        {
            Console.WriteLine("{0}% completed", e.ProgressPercentage);
        };
        client.DownloadStringCompleted += (sender, e) =>
        {
            // e.Result contains downloaded string
            Console.WriteLine("finished downloading...");
        };
        client.DownloadStringAsync(new Uri("http://www.stackoverflow.com"));
        Console.ReadKey();
    }
}

WinForms 응용 프로그램에서 사용하기로 결정한 경우 수수료/부르다 UI 스레드에서 실행되지 않으므로 이벤트 처리기의 패턴.

다른 팁

웹 서버가 콘텐츠 길이를 보내지 않으면 더 많은 데이터가 얼마나 많은지 알 수있는 방법이 없으므로 기본적으로 자신이 얼마나 멀리 있는지 아는 것은 불가능합니다.

서버가 동적으로 데이터를 생성 할 수 있습니다. 아직 (데이터의 첫 번째 부분을 얻을 때) 더 많은 데이터를 보내야하는지 알지 못합니다.

무엇이든 주장 진행 상황을 보여주기 위해서 하다 그들에게 전체 크기를 줘. 물론 여러 파일을 다운로드하는 경우 다운로드 한 파일 수와 아직 다운로드해야 할 수 있는지 항상 말할 수 있습니다 (이 경우에도 후자의 숫자는 알 수 없을 수도 있습니다. 크롤러 스타일 앱).

일반적인 접근 방식 중 하나는 "진보를하고있다"는 사실을 나타내는 진행률 표시 줄을 보여주는 것입니다.

링크 된 기사의 다운로드 () 메소드의 코드는 수업의 개인 구성원에 의존하므로

WebRequest.Create("http://www.stackoverflow.com");

컴파일 할 수 있습니다. 실제로 메소드를 호출하고 있습니다. 수업 WebRequest, 그런 다음 결과를 버리고 요청이 실제로 저장되는 곳입니다. 당시에는 라인에 의해

WebRequest.GetResponse();

코드는 Create ()의 응답에 대한 모든 것을 잊어 버렸습니다. (C#은 사례에 민감하므로 WebRequest와 WebRequest는 같은 것이 아니며 WebRequest라는 이름을 WebRequest 클래스의 인스턴스에 제공하는 것은 매우 전통적입니다.)

그러니 줄을 올리십시오

private HttpWebRequest webRequest;
private HttpWebResponse webResponse;

WebRequest 및 Webresponse Objects의 인스턴스로서 클래스 상단의 방법 외부.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top