Trac に HttpWebRequest で接続するときは、UserAgent を設定する

久々に Trac Lighting をインストールして、ひとりプロジェクト管理をしようかなぁと思い

どうせならば、wordpress への投稿ツールを作った時と同じように XML-RPC 経由が良かろうといことで。

.NET(C#)でXML-RPCを使ってブログに投稿する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/1284

Trac への XML-RPC 投稿の場合は、authenticated に XML_RPC の権限を与えて、投稿時には Digest 認証で接続、ってな感じです。このダイジェスト認証なのですが、昨日の夜中に3時間ほどハマりました。

結果から言えば、こんな感じ。

string url = "http://localhost:8000/trac/gokui-ios5";
string userName = "masuda";
string password = "masuda";
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);
req.UserAgent = "trac-post"; // User-Agent が必須★2
req.Credentials = new NetworkCredential(userName, password); // 認証★1
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string txt = sr.ReadToEnd();
Debug.Print(txt);

まずは、★1 のところでダイジェスト認証をします。HttpWebRequest クラスを使うと、ベーシック認証とダイジェスト認証が使えるそうなのですが、この区別は自動的に行われるみたいです。★1 の行をコメントアウトすると、401 のエラーが帰ります。認証を要求しているのだが、ユーザー名、パスワードを送らなかったので、「許可されていません」ってな具合です。

上記は、google で検索して msdn に行きあたると、なんとかなるのですが、★2 の User-Agent の件でハマりました。
この行をコメントアウトすると、500 内部サーバーエラーが発生します。

これが良くわからなくて、なんだろう…と思っていたのですが、Apache のほうで User-Agnet がないのでエラーを返しているみたいなんですね…IIS サーバーのほうでも、ローカルにある IIS 7.0 では User-Agent がなくても大丈夫なのですが、microsoft.com に HttpWebRequest クラスを使って接続すると、同じように内部サーバーエラーが返ります。多分、サーバーで動作しているプログラムの関係かと。

なので、

req.UserAgent = "trac-post";

のように、UserAgent プロパティに設定を適当に設定します。ブラウザを偽装してもよいし、どうせ、XML-RPC なので、ここは適当に設定すればよいでしょう。

これで接続確認だけはできたので、wordpress の時と同じように、http://www.xml-rpc.net/ を使ってチケットを投稿できるようにするか、自前で XML を構築するかを思案。

カテゴリー: C# パーマリンク

Trac に HttpWebRequest で接続するときは、UserAgent を設定する への1件のコメント

  1. Adriana のコメント:

    Heya i am for the primary time here. I found this board and I in finding It really useful & it helped me out a lot.
    I hope to provide something again and help others like you aided me.

コメントは停止中です。