我有一个 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 并不完全相同。
编辑:这是来自提琴手的请求标头和调用另一个站点的站点(我使用了 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);
}