클라이언트의 데이터를 로컬 컴퓨터 (프로그래밍 방식)로 다운로드하려고하는데 웹 서버가 매우 느려서 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 당신이 제한 시간을 설정 할 수 있습니다 대신.WebClient
WebClient
HttpWebRequest
HttpWebRequest
답변
네트워크 케이블을 뽑을 때 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