【问题标题】:WebRequest loading HTMLDocument coming back with all special characters for SSL siteWebRequest 加载 HTMLDocument 并返回 SSL 站点的所有特殊字符
【发布时间】:2018-02-28 12:43:13
【问题描述】:

非常标准的 HttpWebRequest 实现,每当我通过某个 URL 来获取 html 时,它返回的只是特殊字符。下面是一个返回的示例。

现在这个网站是 SSL,所以我想知道这是否与它有关,但我以前从未遇到过这个问题,我已经将它用于其他 SSL 网站。

�


       ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications);
        var request = (HttpWebRequest)WebRequest.Create(url);
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            Stream data = response.GetResponseStream();
            HtmlDocument hDoc = new HtmlDocument();
            using (StreamReader readURLContent = new StreamReader(data))
            {
                html = readURLContent.ReadToEnd();
                hDoc.LoadHtml(html);
            }
        }

对于这个特定问题,我真的找不到任何东西,所以如果有人能指出我正确的方向,那我有点迷失了。

编辑:这是它的样子,因为我无法复制粘贴它

【问题讨论】:

  • 嗯,响应流仍然是编码的。这很常见。你必须解码它。您可以阅读标题或response.CharacterSet 以获取编码(Encoding.GetEncoding(response.CharacterSet);),如果未指定则回退到Encoding.GetEncoding("utf-8");。有时,您必须从 html 页面的元字符集中提取编码以匹配实际使用的编码。
  • 当我们没有您使用的网址时,我们很难重新创建您的错误。如果您把它交给我们,我们可能会在 2 分钟内解决您的问题。

标签: c# ssl httpwebrequest html-agility-pack


【解决方案1】:

我的猜测是响应被压缩了。如果您使用像 Charles 或 Fiddler 这样的 WebDebugger。您可以看到请求的结构和结构以及它们包含的数据 - 这使得以后在编程时复制 http 请求变得更加容易。试试下面的代码。

try
{
    string webAddr = url;
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
    httpWebRequest.ContentType = "text/html; charset=utf-8";
    httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0";
    httpWebRequest.AllowAutoRedirect = true;
    httpWebRequest.Method = "GET";
    httpWebRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;


    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream(), Encoding.UTF8))
    {
        var responseText = streamReader.ReadToEnd();
        doc.LoadHtml(responseText);
    }
}
catch (WebException ex)
{
    Console.WriteLine(ex.Message);
}

代码设置请求的编码。您还可以在读取响应时在流读取器上设置编码。并开启了自动解压功能。

【讨论】:

  • 流看起来像 GZip 压缩,但如果只是 Gzip 压缩,那些“\u” unicode 符号不应该存在。它似乎也是 Unicode 编码的。这不应该发生。如果没有标头(即HttpRequestHeader.AcceptEncoding, "gzip, deflate")指定您接受它,您会得到一个 Gzipped 流,这很奇怪。也许 OP 显示的代码不是全部,并且配置错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
相关资源
最近更新 更多