Как изменить тайм-аут на a.NET WebClient объект



Я пытаюсь загрузить данные клиента на мой локальный компьютер (программно) и их веб-сервер очень, очень медленно, что вызывает тайм-аут в моем

805   7  

7 ответов:

вы можете продлить тайм-аут: наследовать исходный класс WebClient и переопределить геттер webrequest, чтобы установить свой собственный тайм-аут, как в следующем примере. MyWebClient был частным классом в моем случае

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

вы должны использовать HttpWebRequest, а не WebClient Как вы не можете установить тайм-аут на WebClient не расширяя его (даже если он использует HttpWebRequest). Используя HttpWebRequest вместо позволит вам установить тайм-аут.

первое решение не работает для меня, но вот некоторый код, который работал для меня.

    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);
        }
    }

не удалось получить код 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);
}

как 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

для полноты, вот решение kisp портировано на 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

Comments

    Ничего не найдено.