在WebClient上更改超时

时间:2014-05-01 19:17:35

标签: vb.net timeout webclient

我需要更改WebClient对象的超时。我有一个查询,我正在通过浏览器URL检索CSV,但在我的.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;
        }
    }

这就是我现在所拥有的,如果有人能给我一个线索,我会很感激!

2 个答案:

答案 0 :(得分:1)

男人我感到愚蠢......

无论如何,在仔细观察之后,我想出了我需要做的事情。我通常会删除这样的问题,但由于我只是想出了我所遗漏的内容并且很难找到,我会继续发布答案。

我只需要将这些行添加到我的班级中:

Property Timeout As Integer  '(I actually did this the "proper" way, but this would be sufficient.)

和Override for GetWebRequest:

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

答案 1 :(得分:0)

对于可能不需要添加自定义cookie处理的其他用户,可能不需要添加自定义cookie处理,有一种更简单的方法可以更改超时。

在我的项目中,我使用了这个简单的代码片段:

Dim request As HttpWebRequest = CType(WebRequest.Create(url), HttpWebRequest)
request.Timeout = 10 * 60 * 1000 ' 10 minutes

不需要自定义类(它们已经存在)。