2011-08-08 6 views
11

Webclient에 문제가 있습니다.WebClient가 매우 느립니다.

매우 느립니다. 한 웹 사이트에서 downloadString을 다운로드하는 데 3-5 초 정도 걸립니다. 네트워크에 문제가 없습니다.

이것은 내 Modifed WebClient입니다.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 

namespace StatusChecker 
{ 
    class WebClientEx: WebClient 
    { 
     public CookieContainer CookieContainer { get; private set; } 

     public WebClientEx() 
     { 
      CookieContainer = new CookieContainer(); 

      ServicePointManager.Expect100Continue = false; 
      Encoding = System.Text.Encoding.UTF8; 

      WebRequest.DefaultWebProxy = null; 
      Proxy = null; 
     } 

     public void ClearCookies() 
     { 
      CookieContainer = new CookieContainer(); 
     } 

     protected override WebRequest GetWebRequest(Uri address) 
     { 

      var request = base.GetWebRequest(address); 
      if (request is HttpWebRequest) 
      { 
       (request as HttpWebRequest).CookieContainer = CookieContainer; 
      } 
      return request; 
     } 
    } 
} 

UPDATE : 은 와이어 샤크에서 나는 하나의 DownladString 보내고 몇 수천 패킷을 수신하는 것을 보았다.

+4

웹 클라이언트 특히 느린 아닌, 문제는 다른 곳에서해야합니다 ... 아마 당신이 다운로드하는 웹 사이트가 느린가요? –

+1

WireShark와 같은 트래픽 로거를 사용하여 지연이 실제로 네트워크/서버 속도 저하로 인해 발생하는 단일 요청 및 응답 프레임 사이인지 확인하거나 클라이언트 코드가 잘못되어 너무 많은 요청 또는 일부 로직을 전송하기 때문에 발생하는지 확인해야합니다 오류. –

+0

또한 루프를 여러 번 실행하여 프로세스를 '워밍업'합니다 (예 : 어셈블리가로드되지 않도록). –

답변

30

(나는 이전에 내 자신의 프로그램에 나타났습니다 있음) 여기에 손에 두 가지 문제가있을 수 있습니다 :

  • 첫 번째 요청이 비정상적으로 오랜 시간이 소요 :이 WebRequest 때문에 기본적으로 발생 처음 시작될 때 프록시 설정을 감지하고로드하므로 꽤 오래 걸릴 수 있습니다. 이를 중지하려면 null에 프록시 속성 (WebRequest.Proxy)를 설정하고 당신은 한 번에 2 개 이상의 항목을 다운로드 할 수 없습니다
  • (직접 인터넷에 액세스 할 수 있습니다 제공) 체크 우회 것 : 기본적으로를, 2 개의 동시 HTTP 연결 만 열 수 있습니다. 이를 변경하려면 ServicePointManager.DefaultConnectionLimit을 더 크게 설정하십시오. 보통 int.MaxValue으로 설정합니다 (1,000,000 개의 연결로 스팸하지 않도록하십시오).
+1

내 경우에는 정답이 아닙니다. 내가 이미 all proxy를 null로 설정 한 것을 볼 수 있습니다. 그리고 나는 동시에 2 개의 아이템을 다운로드하지는 않는다. Wireshark의 내 게시물에 추가 된 것처럼, 내 앱이 다운로드 문자열 당 수천 개의 패킷을 보내고받는 것을 볼 수 있습니다. 문자열은 google.com과 같은 간단한 웹 사이트입니다. – Hooch

+0

비정상적으로 느리지 않으면 (keepalives가 꺼진 상태에서 연결 속도가 거의 같음을 의미), 정상적으로 작동합니다. 핸드 쉐이크를 실행하고, 요청을하고, 서버가 응답을 생성 할 때까지 기다렸다가 응답을 읽는 데는 시간이 걸립니다. – foxy

+0

살아있는 생명체에 대해 좀 더 자세히 말해 줄 수 있습니까? 왜 내 앱이 수천 개의 패킷을 전송합니까? – Hooch

0

아마도 누군가에게 도움이 될 것입니다. 일부 웹 서비스는 압축 (gzip 또는 기타)을 지원합니다. 따라서 요청에 Accept-Encoding 헤더를 추가 한 다음 웹 클라이언트 인스턴스에 automatic decompression을 사용하도록 설정할 수 있습니다. Chrome은 그런 식으로 작동합니다. 이 확인되는 최초의 프록시 설정과 관련되어있는 경우

0

몇 가지 옵션이 있습니다 :

  1. Internet Explorer에서 자동 프록시 검색 설정을 해제
  2. 를 NULL로 설정 프록시 :

    WebClient.Proxy = null

  3. 응용 프로그램 시작시 기본 webproxy를 null로 설정하십시오.

    WebRequest.DefaultWebProxy = null;

나이 .NET 코드 대신 null로 설정, 당신은이를 작성하는 데 사용 (하지만 널 지금 선호) :

webclient.Proxy = GlobalProxySelection.GetEmptyWebProxy(); 
관련 문제