1

似乎当从 Microsoft HTTPClient(3.5 及之前的包装器)或 HTTPWebResponse(.NET 4.0 及更高版本)读取响应流时,两个实例都开始返回二进制内容。

我们有数百个网络蜘蛛,其中许多使用不同的框架或“一次性”代码。并且他们一一开始为HTML返回垃圾。我认为这是我们正在接触和重建 DLL 的那些。这让我觉得框架发生了一些变化。

这是我的主要方法:

Public Function PostPage(ByVal URL As String, ByVal enc As Encoding) As String
    Try
        ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)
        Dim htmlRequest As HttpWebRequest = DirectCast(WebRequest.Create(URL), HttpWebRequest)
        htmlRequest.Headers.Add("Accept-Encoding", "gzip, deflate")
        Dim htmlResponse As HttpWebResponse = DirectCast(htmlRequest.GetResponse(), HttpWebResponse)
        Return New System.IO.StreamReader(htmlResponse.GetResponseStream(), enc).ReadToEnd()
    Catch ex As Exception
        Console.WriteLine("Error: " & ex.Message)
    End Try
    Return ""
End Function

这是非常基本的,我不确定发生了什么,每种类型的编码(包括不指定任何编码)都返回二进制。这是我输入http://www.google.comURL 时出现问题的工作表示。

4

2 回答 2

2

当您添加 Accept-Encoding 标头时,您是在告诉 Web 服务器:“请向我发送一个使用 GZIP 或 DEFLATE 压缩的响应。”

网络服务器尽职尽责地返回这样的响应,您的客户端获取压缩内容。如果您想解压缩该内容,并且您的对象不支持自动解压缩,则必须手动执行此操作。

与其手动添加 Accept-Encoding 标头,不如告诉 .NET 执行此操作并代表您自动解压缩响应。

htmlRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

于 2013-08-15T18:29:16.623 回答
0

正如我在问题中所说:相信是编码,我编写了一个循环,循环遍历所有可能的编码,包括 UTF8 和 UTF7,甚至是意大利语和其他语言等等。(139 我认为是)。它将编码名称和 HTML 结果存储在字典中,然后我查看了它,发现它全是垃圾。

Sub LearnEncoding(ByVal MyURL As String)
    Dim dctResults As New Dictionary(Of String, String)
    For Each objEncoding In System.Text.Encoding.GetEncodings
        If dctResults.ContainsKey(objEncoding.DisplayName) = False Then
            Dim MySpider As New clsWebSpider
            dctResults.Add(objEncoding.DisplayName, MySpider.PostPage(MyURL, objEncoding.GetEncoding))
        End If
    Next
End Sub

经过大量研究和测试,我发现问题出在:

Accept-Encoding: gzip, deflate

什么!?!?

这是默认情况下在 MSHTTPClient 中的,当您从浏览器请求中查看 Fiddler 中的标头时自然会出现。当然,浏览器并不关心垃圾,它们似乎能够解码任何东西。我不写解码器。

因此,对于我们的许多使用 MSHTTPClient 的蜘蛛,我们调用 DefaultHeaders.AcceptEncoding.Clear(),而对于我们的 HttpWebRequests,我们只是删除了 AcceptEncoding 的设置行。他们都再次返回良好的 HTML。我研究了框架的变化,但找不到任何解释它的东西。

于 2013-08-14T15:48:47.963 回答