1

ASP.NET MVC 4モバイルWebサイト(.cshtml)内から呼び出してhtml応答文字列を取得するASP.NET Webサイト(.aspx)があります。どちらのサイトも、Windows Server2008R2システムでホストされています。これらは、VS2010Professionalで作成および公開されます。

-外部サイトに直接アクセスしてソースを表示する場合、それは正しいです。

-外部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()正確な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
}

解決:

残念ながら、2つの答えを受け入れることはできません。IcarusとJamesLawrukの両方の回答は、私が問題を解決するのに役立ちました。私は、最近私を最終的な解決策に導いたものに基づいて答えを選んでいます。両方に感謝します!

簡単に言うと、次のような解決策があります。

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

ユーザー エージェントの値を設定して、さまざまなブラウザーで試してみてください。これは、Web サイトがユーザー エージェント ヘッダーに基づいて 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 をまったく変更しないため、Browser Sniffing である可能性が最も高いです。

Fiddler を使用して、まったく同じ方法で要求ヘッダーを設定すると、おそらくこれを確認できますWebClient。同じ HTML 出力が得られるはずです。

于 2012-11-27T17:24:05.780 に答える