.net - 10 次连续请求后 HttpWebRequest 超时

标签 .net vb.net httpwebrequest

我正在为特定站点编写网络爬虫。该应用程序是一个不使用多线程的 VB.Net Windows 窗体应用程序 - 每个 Web 请求都是连续的。然而,在十次成功的页面检索之后,每个连续的请求都会超时。

我已经查看了已经在 SO 上发布的类似问题,并将推荐的技术实现到我的 GetPage 例程中,如下所示:

Public Function GetPage(ByVal url As String) As String
    Dim result As String = String.Empty

    Dim uri As New Uri(url)
    Dim sp As ServicePoint = ServicePointManager.FindServicePoint(uri)
    sp.ConnectionLimit = 100

    Dim request As HttpWebRequest = WebRequest.Create(uri)
    request.KeepAlive = False
    request.Timeout = 15000

    Try
        Using response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse)
            Using dataStream As Stream = response.GetResponseStream()
                Using reader As New StreamReader(dataStream)
                    If response.StatusCode <> HttpStatusCode.OK Then
                        Throw New Exception("Got response status code: " + response.StatusCode)
                    End If
                    result = reader.ReadToEnd()
                End Using
            End Using
            response.Close()
        End Using

    Catch ex As Exception
        Dim msg As String = "Error reading page """ & url & """. " & ex.Message
        Logger.LogMessage(msg, LogOutputLevel.Diagnostics)
    End Try

    Return result

End Function

我错过了什么吗?我是否没有关闭或处理应该关闭的对象?它总是在连续十次请求后发生,这似乎很奇怪。

笔记:
  • 在此方法所在的类的构造函数中,我有以下内容:

    ServicePointManager.DefaultConnectionLimit = 100
  • 如果我将 KeepAlive 设置为 true,则在五个请求后开始超时。
  • 所有请求都针对同一域中的页面。

  • 编辑

    我在每个 Web 请求之间添加了 2 到 7 秒的延迟,这样我就不会“攻击”站点或尝试进行 DOS 攻击。但是,问题仍然存在。

    最佳答案

    我今天遇到了这个问题,我的解决方案是确保响应始终关闭。

    我认为您需要在将异常放入 using 之前放入 response.Close() 。

    Using response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse) 
            Using dataStream As Stream = response.GetResponseStream() 
                Using reader As New StreamReader(dataStream) 
                    If response.StatusCode <> HttpStatusCode.OK Then 
                        response.Close()  
                        Throw New Exception("Got response status code: " + response.StatusCode) 
                    End If 
                    result = reader.ReadToEnd() 
                End Using 
            End Using 
            response.Close() 
        End Using
    

    关于.net - 10 次连续请求后 HttpWebRequest 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191926/

    相关文章:

    .net - 在 Windows 7 多点触控上按下 WPF 按钮

    java - VB.Net 服务器与 Java 客户端(Socket)发送和接收文本

    c# - 限制网络请求

    .net - Windows Workflow是否被广泛使用?

    c# - NHibernate 拦截器不工作

    mysql - 无法将空白日期字段导入 MySQL 数据库

    ASP.NET 在请求期间存储上下文数据

    c# - .NET 等同于将文件上传到 REST API 的 curl?

    .net - 在 .NET 中使用线程本地存储的最佳实践是什么?

    vb.net - 验证此日期格式的最简单方法是什么,例如 2010 年 7 月 31 日(且仅限此 fmt)