1

我有一个 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);
     }
4

2 回答 2

2

尝试设置用户代理值并尝试使用不同的浏览器。这可能证明网站正在根据用户代理标头切换 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");
于 2012-11-27T18:47:17.497 回答
1

正如 Dour 在他的评论中指出的那样,很可能是浏览器嗅探,因为WebClient根本不会改变生成的 HTML。

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

于 2012-11-27T17:24:05.780 回答