.net 如何使用HTTPWebRequest解压GZIP/DEFLATE内容

.net 如何使用HTTPWebRequest解压GZIP/DEFLATE内容,.net,httpwebrequest,httpclient,.net,Httpwebrequest,Httpclient,从Microsoft HTTPClient(3.5及之前版本中的包装器)或HTTPWebResponse(.NET 4.0及更高版本)读取响应流时,两个实例都开始返回二进制内容 我们有数百个web爬行器,许多使用不同的框架或“一次性”代码。他们一个接一个地开始为HTML返回垃圾。我想这是我们正在接触和重建DLL的。这让我觉得框架发生了变化 这是我的主要方法: Public Function PostPage(ByVal URL As String, ByVal enc As Encoding)

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

我们有数百个web爬行器,许多使用不同的框架或“一次性”代码。他们一个接一个地开始为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.com
作为URL。

正如我在问题中所说:我相信这是编码,所以写了一个循环,循环所有可能的编码,包括UTF8和UTF7,甚至是意大利语和其他语言以及所有东西。(我想是的)。它将编码名称和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。我研究了对框架的更改,但找不到任何解释。

当您添加接受编码头时,您告诉web服务器:“请向我发送一个使用GZIP或DEFLATE压缩的响应。”

Web服务器尽职尽责地返回这样的响应,您的客户机将获得压缩内容。如果要解压缩该内容,如果对象不支持自动解压缩,则必须手动进行解压缩

与其手动添加Accept Encoding标头,不如告诉.NET这样做,并代表您自动解压缩响应


htmlRequest.AutomaticDecompression=DecompressionMethods.Deflate | DecompressionMethods.GZip

否决票?这在我身上从未发生过。。。有人能告诉我我需要做什么来消除这种情况吗,哈哈。谢谢,我喜欢使用对象属性而不是字符串输入。我测试了它的性能,它工作正常
htmlRequest.AutomaticDecompression=(DecompressionMethods.Deflate或DecompressionMethods.GZip)