【问题标题】:WebClient.DownloadString seems to change some of the html from an external siteWebClient.DownloadString 似乎从外部站点更改了一些 html
【发布时间】:2012-11-27 16:43:21
【问题描述】:

我有一个 ASP.NET 网站 (.aspx),我从 ASP.NET MVC 4 移动网站 (.cshtml) 中调用它以获取其 html 响应字符串。这两个站点都托管在 Windows Server 2008 R2 系统上。它们是使用 VS2010 Professional 创建和发布的。

-如果我直接去外部站点查看源代码是正确的。

-如果我使用以下任何一种方式获取外部 html:

 using (WebClient client = new WebClient())
     {
         html = client.DownloadString(strUrl);
     }

 using (WebClient client = new WebClient())
     { 
        byte[] DataBuffer = client.DownloadData(strUrl);
        html = Encoding.ASCII.GetString(DataBuffer);
     }

WebResponse objResponse;
WebRequest objRequest = System.Net.HttpWebRequest.Create(strUrl);
objResponse = objRequest.GetResponse();
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
   html = sr.ReadToEnd();
   sr.Close();
}

然后 html 从此更改(其中 font-family 设置在父表上):

<td align="right" style="color:Red;background-color:White;width:4.375em;border-bottom:1px solid black;border-right:1px solid black;">-27.0%</td>

到这里:

<td align="right" bgcolor="White" style="border-bottom:1px solid black;border-right:1px solid black;"><font face="Arial,sans-serif" color="Red">-27.0%</font></td>

除了字体样式更改为标记、背景颜色从样式更改为标记属性以及宽度样式被完全删除之外,我看起来没有其他任何更改。这发生在整个页面上。 如果我在 html 变量上放置一个断点并查看它,那么在调用 DownloadString 时 html 已经被更改。

有人知道为什么会这样吗?

提前致谢。

编辑: 此链接:WebClient.DownloadString() Not Producing Exact HTML 与我不在外部页面上使用 Ajax 或 JavaScript 不太一样。

编辑: 这是来自 fiddler 的请求标头和调用另一个站点的站点(我使用的是 Chrome):

GET / HTTP/1.1
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: .ASPXBrowserOverride=Mozilla%2f4.0+(compatible%3b+MSIE+6.0%3b+Windows+CE%3b+IEMobile+8.12%3b+MSIEMobile+6.0); 

直接访问网站我得到这个请求头:

Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: .ASPXBrowserOverride=Mozilla%2f4.0+(compatible%3b+MSIE+6.0%3b+Windows+CE%3b+IEMobile+8.12%3b+MSIEMobile+6.0); 

编辑:

如果我在调试模式下查看客户端对象 client.Headers 在调用 DownloadString 之前和之后为空。 此外,在此处调用 DownloadString 之后是 client.ResponseHeaders:

{Content-Length: 267123
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Tue, 27 Nov 2012 18:37:27 GMT
Set-Cookie: ASP.NET_SessionId=******; path=/; HttpOnly
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
}

解决方案:

很遗憾,我不能接受两个答案。 Icarus 和 James Lawruk 的回答都帮助我解决了这个问题。我正在根据最近引导我找到最终解决方案的内容来选择答案。非常感谢你们!

所以这里是一个简单的解决方案:

使用 fiddler 查看请求标头并找到用户代理。 修改代码如下:

using (WebClient client = new WebClient())
     {
         client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11");
         html = client.DownloadString(strUrl);
     }

【问题讨论】:

  • 它是什么类型的网站? Windows 与 Linux 托管?什么内容管理系统?等
  • @James Lawruk - 我用这些信息更新了我的问题。

标签: asp.net html webclient


【解决方案1】:

尝试设置用户代理值并尝试使用不同的浏览器。这可能证明网站正在根据用户代理标头切换 HTML 响应。

webClient.Headers.Add("user-agent", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5");
var iphoneHtml = webClient.DownloadString("http://www.yoursite.com");
webClient.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11");
var safariHtml = webClient.DownloadString("http://www.yoursite.com");

【讨论】:

  • 嘿!这样做但将其设置为我在提琴手中找到的用户代理似乎已经解决了我的问题.....“Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/ 537.11"........这是什么意思?我认为,为了将来的验证,硬编码用户代理可能是一个坏主意,但我不确定。
  • 默认情况下,Webclient 不发送用户代理头,因此网站必须有代码通过发送不同的标记来响应。
【解决方案2】:

Dour 在他的评论中指出,最有可能是浏览器嗅探,因为WebClient 根本不会更改生成的 HTML。

如果您使用 Fiddler 并以与 WebClient 完全相同的方式设置请求标头,您可能可以验证这一点。我打赌你会得到相同的 HTML 输出。

【讨论】:

  • 我从 fiddler 发布了请求标头,但它们看起来一样。
  • @Soenhay WebClient 的 UserAgent 标头怎么会有这样的: User-Agent: Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/ 537.11" ?WebClient 不会添加该标头。您确定您正在查看WebClient 发送的正确标头吗?
  • 我是 fiddler 的新手,所以我可能看错了...我刚刚从 fiddler 中删除了所有会话,然后刷新了网页,以便在 fiddler 中有一行。然后我点击它,这就是请求标题下的内容......如果我对在调试模式下运行的项目做同样的事情,fiddler 中还有其他几行,但它们都有相同的 UserAgent。
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 2017-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多