しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET Web API の Nightly 版を試してみた

Visual Studio 11 Beta と .NET Framework 4.5 Beta を完全に削除して、動かなくなった Visual Studio 2010 を修復したりして何とか Nightly 版が動作する環境を作りました。

Henrik 氏のブログを参照しながら GAC の更新を行うわけですが、MyGet で公開されているパッケージは毎日更新されるので、毎日とは言わずとも定期的に GAC の更新をするのは非常にめんどくさいです。適当にバッチファイル作れば自動で対応できそうな気もしますが、めんどくさいのでまた今度。

とりあえず ASP.NET MVC 4 Beta で追加された Web API プロジェクトを試す - しばやん雑記 でダメだった項目を試してみます。まずは Authorize 属性を付けた時にリダイレクトしてしまう問題から。

[Authorize]
public class ValuesController : ApiController
{
}

コード自体は同じで、単純にコントローラに Authorize 属性を付けただけです。そして実行結果はこんな感じ。

Nightly 版ではちゃんと 401 が返ってくるようになりました。やったね。

Authorize 属性を使った時には HTTP ステータスコード 401 が返されますが、これを無効にしたいという特殊なケースの場合があれば、Web.config に以下の設定を追加すれば無効になります。

<appSettings>
  <add key="webapi:EnableSuppressRedirect" value="false" />
</appSettings>

ちなみに System.Web.Http.WebHost アセンブリの SuppressFormsAuthRedirectModule クラスがこの辺りを処理していて、Microsoft.Web.Infrastructure のDynamicModuleHelper を使って動的に HTTP モジュールが登録されています。自分で何らかの HTTP モジュールを登録したい場合には参考になりそうですね。

そして JSON 形式のデータを POST した時にバインディングが出来ない問題ですが、これはベータで検証した時に Content-Type を適切に設定してなかったのが問題かもしれません…。

まあ、それは置いておいて、JSON 形式のデータで確認してみました。

// 全開は application/json に設定忘れていた
$.ajax({
    type: "POST",
    url: "/api/values",
    contentType: "application/json",
    data: JSON.stringify({ Name: "hauhau" }),
    success: function (obj) {
        alert(obj);
    }
});

Content-Type を application/json に設定するとちゃんとバインディングされました。この辺りは System.Net.Http.Formatting の中にある MediaTypeFormatter 派生クラスが頑張ってるようです。

今回は JSON だったので JsonMediaTypeFormatter が使われていますが、XmlMediaTypeFormatter というのもあるので、XML を POST を送信しても問題なくバインディングできそうです。