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だとフレームなしで見れます。そして、? 以降の引数を無くすとフレームが現れたりします

*2:コレだけでとりにいけるって、やっぱり .NET は便利ですね。C++じゃ書きたくねぇ:ぉ