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 を送信しても問題なくバインディングできそうです。