문제

나는 404를 모두 요청했다. 나는 썼다

    {
    var s = DateTime.Now;
    for(int i=0; i < 100;i++)
        DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg");
    var e = DateTime.Now;
    var d = e-s;
        d=d;
        Console.WriteLine(d);
    }

static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

    try
    {
        wreq = (HttpWebRequest)WebRequest.Create(url);
        wreq.KeepAlive = true;
        wreq.Method = "HEAD";
        wresp = (HttpWebResponse)wreq.GetResponse();
        ret = true;
    }
    catch (System.Net.WebException)
    {
    }
    finally
    {
        if (wresp != null)
            wresp.Close();
    }
    return ret;
}

두 번의 런은 00 : 00 : 30.7968750 및 00 : 00 : 26.8750000을 차지하는 것을 보여줍니다. 그런 다음 Firefox를 시도하고 다음 코드를 사용합니다

<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
    document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>

</body>
</html>

내 comp 시간을 사용하고 계산하는 것은 대략 4 초였습니다. 4 초는 내 앱보다 6.5-7.5입니다. 나는 수천 개의 파일을 스캔 할 계획이므로 30 분 대신 3.75 시간을 복용하는 것이 큰 문제가 될 것입니다. 이 코드를 더 빨리 만들려면 어떻게해야합니까? 누군가가 Firefox가 이미지를 캐시한다고 말할 것이지만 1) 원격 서버에서 헤더를 확인하여 업데이트되었는지 확인해야합니다 (내 앱이 원하는 것입니다) 2) 2) 나는 아닙니다. 본체를 받으면 내 코드는 헤더 만 요청해야합니다. 그렇다면 어떻게 이것을 해결합니까?

도움이 되었습니까?

해결책

아마도 Firefox는 한 번에 여러 요청을 발행하는 반면 코드는 하나씩 수행합니다. 아마도 스레드를 추가하면 프로그램 속도가 빨라질 것입니다.

다른 팁

나는 그것을 알아 차렸다 HttpWebRequest 첫 번째 요청에 매달려 있습니다. 나는 약간의 연구를 수행했고 일어나고있는 것 같습니다. 요청이 프록시를 구성하거나 자동 감지하는 것입니다. 설정하면

request.Proxy = null;

웹 요청 객체에서는 초기 지연을 피할 수 있습니다.

프록시 자동 감지 :

using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}

프록시 자동 감지없이 :

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}

코드를 비동기식 getResponse로 변경하십시오

public override WebResponse GetResponse() {
    •••
    IAsyncResult asyncResult = BeginGetResponse(null, null);
    •••
    return EndGetResponse(asyncResult);
}

비동기를 얻습니다

답은 httpwebrequest/httpwebresponse를 WebRequest/webresponse로만 바꾸는 것입니다. 문제가 해결되었습니다.

코드가 배포 된 컴퓨터에서 IE에서 동일한 URL을 열었습니까? Windows 서버 시스템 인 경우 때로는 요청하는 URL이 보안 사이트의 IE (HTTPWebRequest가 작동하는)에 있지 않기 때문입니다. 추가하면됩니다.

게시 할 수있는 더 많은 정보가 있습니까? 나는 비슷한 일을하고 있으며 이전에 HTTPWebrequest에 많은 문제가 발생했습니다. 모두 독특합니다. 따라서 더 많은 정보가 도움이 될 것입니다.

BTW, 비동기 메소드를 사용하여 호출하는 것은이 경우 실제로 도움이되지 않습니다. 다운로드 시간이 단축되지 않습니다. 그것은 단지 당신의 호출 스레드를 차단하지 않습니다.

완료되면 응답 스트림을 닫으십시오. 따라서 checkexist ()에서 wresp = (httpwebresponse) wreq.getResponse () 후 wresp.close ()를 추가하십시오.

OK 모든 웹 페이지에 대한 상태 코드 404를 얻는 경우 자격 증명을 지정하지 않기 때문입니다. 따라서 추가해야합니다

wreq.Credentials = CredentialCache.DefaultCredentials;

그런 다음 사용자 에이전트를 지정 해야하는 상태 코드 = 500을 발견 할 수도 있습니다. 아래 줄과 같은 것 같습니다

wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";

"WebClient 인스턴스는 기본적으로 옵션 HTTP 헤더를 보내지 않습니다. 요청에 옵션 헤더가 필요한 경우 헤더를 헤더 컬렉션에 추가해야합니다. 예를 들어 응답의 쿼리를 유지하려면 사용자 에이전트 헤더를 추가해야합니다. 또한 사용자 에이전트 헤더가 누락 된 경우 서버는 500 (내부 서버 오류)을 반환 할 수 있습니다. "

참조: https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

httpwebrequest의 성능을 향상 시키려면 추가해야합니다.

wreq.Proxy=null

이제 코드는 다음과 같습니다.

 static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

try
{
    wreq = (HttpWebRequest)WebRequest.Create(url);
    wreq.Credentials = CredentialCache.DefaultCredentials;
    wreq.Proxy=null;
    wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
    wreq.KeepAlive = true;
    wreq.Method = "HEAD";
    wresp = (HttpWebResponse)wreq.GetResponse();
    ret = true;
}
catch (System.Net.WebException)
{
}
finally
{
    if (wresp != null)
        wresp.Close();
}
return ret;

}

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