.NET WebClient 개체에서 시간 초과를 변경하는 방법 컴퓨터 (프로그래밍

클라이언트의 데이터를 로컬 컴퓨터 (프로그래밍 방식)로 다운로드하려고하는데 웹 서버가 매우 느려서 WebClient개체 가 시간 초과됩니다 .

내 코드는 다음과 같습니다.

WebClient webClient = new WebClient();

webClient.Encoding = Encoding.UTF8;
webClient.DownloadFile(downloadUrl, downloadFile);

이 객체에 무한 시간 초과를 설정하는 방법이 있습니까? 또는 다른 방법으로 다른 방법으로 나를 도울 수 없다면?

URL은 브라우저에서 제대로 작동합니다. 표시하는 데 약 3 분이 걸립니다.



답변

다음 예제와 같이 시간 초과를 연장 할 수 있습니다. 원래 WebClient 클래스를 상속하고 webrequest getter를 재정 의하여 고유 한 시간 초과를 설정하십시오.

MyWebClient는 필자의 경우 개인 클래스였습니다.

private class MyWebClient : WebClient
{
    protected override WebRequest GetWebRequest(Uri uri)
    {
        WebRequest w = base.GetWebRequest(uri);
        w.Timeout = 20 * 60 * 1000;
        return w;
    }
}

답변

첫 번째 해결책은 나를 위해 작동하지 않았지만 여기에 나를 위해 일한 코드가 있습니다.

    private class WebClient : System.Net.WebClient
    {
        public int Timeout { get; set; }

        protected override WebRequest GetWebRequest(Uri uri)
        {
            WebRequest lWebRequest = base.GetWebRequest(uri);
            lWebRequest.Timeout = Timeout;
            ((HttpWebRequest)lWebRequest).ReadWriteTimeout = Timeout;
            return lWebRequest;
        }
    }

    private string GetRequest(string aURL)
    {
        using (var lWebClient = new WebClient())
        {
            lWebClient.Timeout = 600 * 60 * 1000;
            return lWebClient.DownloadString(aURL);
        }
    }

답변

시간 초과를 확장하지 않고 설정할 수 없으므로 HttpWebRequest대신 사용해야합니다 (을 사용 하더라도 ). 은 Using 당신이 제한 시간을 설정 할 수 있습니다 대신.WebClientWebClientHttpWebRequestHttpWebRequest


답변

네트워크 케이블을 뽑을 때 w.Timeout 코드가 작동하지 않고 시간 초과되지 않았으며 HttpWebRequest를 사용하여 현재 작업을 수행했습니다.

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadUrl);
request.Timeout = 10000;
request.ReadWriteTimeout = 10000;
var wresp = (HttpWebResponse)request.GetResponse();

using (Stream file = File.OpenWrite(downloadFile))
{
    wresp.GetResponseStream().CopyTo(file);
}

답변

완성도를 높이기 위해 여기에 kib의 솔루션이 VB로 포팅되었습니다 (주석에 코드를 추가 할 수 없음)

Namespace Utils

''' <summary>
''' Subclass of WebClient to provide access to the timeout property
''' </summary>
Public Class WebClient
    Inherits System.Net.WebClient

    Private _TimeoutMS As Integer = 0

    Public Sub New()
        MyBase.New()
    End Sub
    Public Sub New(ByVal TimeoutMS As Integer)
        MyBase.New()
        _TimeoutMS = TimeoutMS
    End Sub
    ''' <summary>
    ''' Set the web call timeout in Milliseconds
    ''' </summary>
    ''' <value></value>
    Public WriteOnly Property setTimeout() As Integer
        Set(ByVal value As Integer)
            _TimeoutMS = value
        End Set
    End Property


    Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest
        Dim w As System.Net.WebRequest = MyBase.GetWebRequest(address)
        If _TimeoutMS <> 0 Then
            w.Timeout = _TimeoutMS
        End If
        Return w
    End Function

End Class

End Namespace

답변

Sohnee가 말했듯이을 사용 System.Net.HttpWebRequest하는 Timeout대신 속성을 사용 하고 설정하십시오 System.Net.WebClient.

그러나 무한 시간 초과 값을 설정할 수는 없습니다 (지원되지 않으며 그렇게 시도하면을 발생 ArgumentOutOfRangeException시킵니다).

먼저 HEAD HTTP 요청을 수행 Content-Length하고 다운로드중인 파일의 바이트 수를 판별하기 위해 리턴 된 헤더 값을 조사한 후 후속 GET요청 에 따라 제한 시간 값을 설정 하거나 단순히 매우 긴 제한 시간 값을 지정하는 것이 좋습니다. 절대 초과하지 않을 것입니다.


답변

'CORRECTED VERSION OF LAST FUNCTION IN VISUAL BASIC BY GLENNG

Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest
            Dim w As System.Net.WebRequest = MyBase.GetWebRequest(address)
            If _TimeoutMS <> 0 Then
                w.Timeout = _TimeoutMS
            End If
            Return w  '<<< NOTICE: MyBase.GetWebRequest(address) DOES NOT WORK >>>
        End Function