我需要更改WebClient对象的超时。我传递了一个查询来检索CSV,该查询可以通过浏览器URL工作,但在我的.Net项目中不起作用。客户端似乎超时了。这是线路。。。
ResponseText = Client.DownloadString("http://someBIwebquery.com")
该行执行,但ResponseText之后没有任何内容。我过去曾使用相同的方法将其他查询传递到同一服务器,同样,当作为浏览器URL传递时,这确实有效,所以问题只是WebClient超时。
更复杂的是,这个对象已经被修改为接受cookie,所以我已经有了一个修改过的WebClient类:
Imports System.Net
Public Class CookieAwareWebClient
Inherits WebClient
Private cc As New CookieContainer()
Private lastPage As String
Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest
Dim R = MyBase.GetWebRequest(address)
If TypeOf R Is HttpWebRequest Then
With DirectCast(R, HttpWebRequest)
.CookieContainer = cc
If Not lastPage Is Nothing Then
.Referer = lastPage
End If
End With
End If
lastPage = address.ToString()
Return R
End Function
Protected Overrides WebRequest GetWebRequest(Uri address)
End Class
我需要找到一种方法来覆盖超时请求。我已经找到了这个C#代码,但我在翻译它时遇到了困难。当谈到C#时,我并不是完全一无所知,但我缺少了一些东西:
private class MyWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri uri)
{
WebRequest w = base.GetWebRequest(uri);
w.Timeout = 20 * 60 * 1000;
return w;
}
}
这就是我现在所拥有的,如果有人能给我一个线索,我将不胜感激!
伙计,我觉得自己很笨。。。。
不管怎么说,在仔细研究了这个问题后,我发现了我需要做什么。我通常会删除这样的问题,但由于我刚刚发现我遗漏了什么,很难找到,我将继续发布答案。
我只需要把这些行添加到我的类中:
Property Timeout As Integer '(I actually did this the "proper" way, but this would be sufficient.)
以及在GetWebRequest的Override:中
R.Timeout = Me.Timeout
差不多了。这是完整的课程:
Imports System.Net
Public Class CookieAwareWebClient
Inherits WebClient
Private cc As New CookieContainer()
Private lastPage As String
Private _Timeout As Integer
Public Property Timeout() As Integer
Get
Return _Timeout
End Get
Set(ByVal value As Integer)
_Timeout = value
End Set
End Property
Protected Overrides Function GetWebRequest(ByVal address As System.Uri) As System.Net.WebRequest
Dim R = MyBase.GetWebRequest(address)
R.Timeout = Me.Timeout
If TypeOf R Is HttpWebRequest Then
With DirectCast(R, HttpWebRequest)
.CookieContainer = cc
If Not lastPage Is Nothing Then
.Referer = lastPage
End If
End With
End If
lastPage = address.ToString()
Return R
End Function
End Class
对于其他可能不需要添加自定义cookie处理的用户,有一种更简单的方法可以更改超时。
在我的项目中,我使用了这个片段,它要简单得多:
Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
request.Timeout = 10 * 60 * 1000 ' 10 minutes
不需要自定义类(它们已经存在(。