原典:ASP.NET Web API: CORS support and Attribute Based Routing Improvements
ASP.NET Web API:CORSサポートと属性ベースのルーティング改善
初回リリースから、莫大なASP.NET Web APIを採用してきました。2月に、ASP.NET and Web Tools 2012.2 Updateを出荷し、Web APIおよびその他のASP.NETコンポーネントにさらに多数の新機能が追加されました。
ASP.NETチームは、次期新機能(素晴らしい機能が盛りだくさん)の開発に必死で取り組んでいます。今回の開発で素晴らしいことの一つが、チームのオープンソース開発プロセスの使い方です。これは、以前この春に採用すると告知していた、より親密にコミュニティと協力し合い、早期に新機能を評価して頂いたり、コミュニティの開発者に新機能の開発に直接貢献して頂くというものです。
以下は、2つの次期ASP.NET Web API新機能についての追加情報です。
これは、ASP.NET MVPのBrock Allen氏とTim McCall氏が開発、貢献してくれたものです(attributerouting.netで有名)。
ASP.NET Web APIへのCORSサポート
クロスオリジンリソース共有とは(CORS)、Webページから異なるドメインにAJAXリクエストできるようにするW3C基準です。この基準は、コールを行うリソースのドメインへのコールを規制する、Webブラウザで実装された同じオリジンポリシーを緩和します。CORSの仕様には、クロスオリジンコールを行う時のブラウザとサーバのやり取りが定義されています。
以下の画像は、Contosoドメインにクロスドメインコールを行なっているASP.NET Web API Test Tool(http://xyz123.azurewebsites.net/で実行されている)を表示しています。
SENDをクリックすると、クロスオリジンリクエストが行われます。Contosoサイトは、CORSサポートを設定していないので、エラーダイアログが表示されます。
CORSエラーは、IE F12ツールのConsoleタブに表示されます。
セキュリティ上、Webブラウザは、azurewebsitesドメインからContosoドメインへのコールはできません。新しいASP.NET Web API CORSフレームワークでは、Contoso.comに正しいCORSヘッダが設定できるので、ブラウザはクロスオリジンコールを受けられます。
MVPのBrock Allen氏は、ASP.NET Webstackリポジトリに彼のCORSソースを寄与してくれ、Yao Huang Lin(ASP.NETチームの開発者)と一緒に、デザインの改良を繰り返し、Webstackリポジトリに保管しました。
Brock Allen氏と、Dan Roth氏と、Yaoは、Brock氏のCORS寄与について、このChannel 9ビデオで論じています。
ASP.NET Web APIのCORSサポートページには、この新機能の始め方が書かれています。
ASP.NET Web APIの属性ベース・ルーティング
最近、ASP.NET Web APIのロードマップを発行しました。ASP.NET Web APIで属性ベースのルーティングをサポートするためです。Route属性は、URL定義を特定のURLに対して実行するコードに近づけるため、どのURLがどのコードブロックに呼び出されるのかを簡単に把握でき、多くの共通のルーティングシナリオを単純化できます。
例えば、標準のHTTPアクション(GET、POST、PUT、DELETEなど)と、Approveなどの追加の独自アクションを持ったWeb APIを定義したい場合は、Approveアクションのグローバルルートテーブルにルートを追加せずに、直接アクションに属性をつけます。
public class OrdersController : ApiController { public IEnumerable<Order> GetOrders() {…} public Order GetOrder(int id) {…} public Order Post(Order order) {…} [HttpPost("orders/{id}/approve")] public Order Approve(int id) {…} }
拡張されたルートテンプレートの文法では、ルート値に対するデフォルトの値や制約を簡単に指定できます。例えば、パラメータの型に応じて呼び出される2つのアクションが簡単に作れます。以下のPeopleコントローラでは、GetByIDアクションのIDパラメータはintの値しか取りません。GetByNameアクションメソッドには、“Nick”のデフォルト名が含まれています。
public class PeopleController : ApiController { [HttpGet("{name=Nick}")] public sttring GetByName(sttring name) {…} [HttpGet("{id:int}")] public sttring GetById(int id) {…} }
Web APIの共通のルートプレフィックスも定義できます。例えば、リソース階層を設定するためにルートプレフィックスを使用こともできます。
[RoutePrefix("movies")] [RoutePrefix("actors/{actorId}/movies")] [RoutePrefix("directors/{directorId}/movies")] public class MoviesController : ApiController { public IEnumerable<Movie> GetMovies() {…} public IEnumerable<Movie> GetMoviesByActor(int actorId) {…} public IEnumerable<Movie> GetMoviesByDirector(int directorId) {…} }
または、Web APIの複数のバージョンを扱うためにルートプレフィックスを使用できます。
[RoutePrefix("api/v1/customers")] public class CustomersV1Controller : ApiController {…} [RoutePrefix("api/v2/customers")] public class CustomersV2Controller : ApiController {…}
ASP.NET Web APIの新しいCORSサポートと同様に、新しい属性ベースルーティングのサポートは、コミュニティからの寄与が大きいです。attributerouting.netで有名なTim McCall氏と密接に作業しており、彼のAttributeRoutingプロジェクトの多数の機能を、ASP.NET Web APIに直接持ち込んでいます。
ASP.NETチームとコミュニティのコラボが今後どのようにASP.NETプラットフォームを発展させていくのか非常に楽しみです。
Hope this helps,
Scott
P.S.ブログに加え、現在Twitterを使って簡単な更新やリンク共有を行っています。twitter.com/scottguで、私をフォローしてください。