SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Scott Guthrie氏 Blog翻訳

ASP.NET Web API: CORSサポートと属性ベースのルーティング改善

連載:ScottGu's Blog翻訳

  • このエントリーをはてなブックマークに追加

 本稿は、Scott Guthrie氏のブログを、氏の許可を得て、翻訳、転載したものです。米Microsoft社の副社長で、ASP.NETやSilverlightの開発チームを統率する氏のブログでは、次期製品を含む最新の技術をいち早く紹介しています。

  • このエントリーをはてなブックマークに追加

 原典: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で、私をフォローしてください。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
Scott Guthrie氏 Blog翻訳連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト Chica(チカ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Scott Guthrie(Scott Guthrie)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/7110 2013/04/26 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング