500 Internal Server Error by MSDN library
例えば、
http://msdn.microsoft.com/library/ja/jpmltimd/html/_win32_mmioopen.asp?frame=true
なんて URL に飛ぶと、mmioOpen 関数のヘルプが見れます。*1
さて、仮の話として上記URLのhtmlを .NET Frameworks を利用して DL しようとします。 C#では、次の様なコードになるでしょう。*2
string strURL= "http://msdn.microsoft.com/library/ ....";
WebRequest pcReq = WebRequest.Create(strURL);
WebResponse pcRes = pcReq.GetResponse();
ところがどっこい。GetResponse() を呼んだところで次の様な例外が発生してしまいます。
'System.Net.WebException' のハンドルされていない例外が system.dll で発生しました。
追加情報 : リモート サーバーがエラーを返しました : (500) 内部サーバー エラーです
はて? ブラウザから見るとOKなのに、.NET から拾おうとするとダメですか。んまぁ、この時点で、考えられる事は「リクエストヘッダーの情報が不足している」事と予想がつくわけですが……
わたしゃ、http なんてお喋りできんがな。 orz
んまぁそれでもやらなきゃならん。
とりあえず、ブラウザと .NET からのリクエストヘッダーの違いを調べる為に 確認くん を利用してみた所、どーやら .NET からアクセスすると User-Agent が何も無いようなのですよ。 とりあえずこれが一番怪しいって事で、設定してみようと次の様なコードにしてみた訳ですが
WebRequest pcReq = WebRequest.Create(m_strURL);
pcReq.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
WebResponse pcRes = pcReq.GetResponse();
'System.ArgumentException' のハンドルされていない例外が system.dll で発生しました。
追加情報 : このヘッダーは、適切なプロパティで変更しなければなりません。
なんて例外が出てくる。WebHeaderCollection クラス のドキュメントを見ると「制限付きヘッダー」という項目に "User-Agent" がリストアップされている。……変更させない気か Microsoft おぉ!!!
でまぁ、結局の所どうするべきなのかとMSDNを眺めていた所、こうなりました。
WebRequest pcReq = WebRequest.Create(m_strURL);
HttpWebRequest pcHttpReq = (HttpWebRequest)pcReq;
pcHttpReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)";
WebResponse pcRes = pcReq.GetResponse();
…アップキャストですかそうですかそうですか。orz
つか、Microsoft も UserAgent 無しで 500 出す仕様ってのもどーなのよ。ぶーぶー!
02/07 加筆修正
最初のurl は、JavaScriptがon/offで動作が違うことを発見。それに伴う文章の修正を行いました。
*1:興味深い事に JavaScriptが Offの場合、上記URLだとフレームなしで見れます。そして、? 以降の引数を無くすとフレームが現れたりします