4

私は、非常に単純なことだと思っていた Web API ルーティングをセットアップしようとしています。ただし、Web API でのルーティングは、さまざまな HTTP 動詞と一致していないようです。これらのアクションを備えたこのコントローラーがあるとします...

public class AvalancheController : ApiControllerBase
{

    // GET api/avalanche
    public IEnumerable<Avalanche> Get() {}

    // GET api/avalanche/5
    public Avalanche Get(int id) {}

    // GET api/avalanche/ActionTest/5
    [ActionName("ActionTest")]
    public Avalanche GetActionTest(int id) {}

    // GET api/avalanche/ActionTest/2
    [ActionName("ActionTest2")]
    public Avalanche GetActionTest2(int id) {}

    // POST api/avalanche
    public void Post([FromBody]Avalanche value) {}

    // PUT api/avalanche/5
    public void Put(int id, [FromBody]Avalanche value) {}

    // PUT api/avalanche/test/5
    [ActionName("Test")]
    public void PutTest(int id, [FromBody]Avalanche value) {}

    // DELETE api/avalanche/5
    public void Delete(int id) {}
}

そして、次のルートが定義されています...

    config.Routes.MapHttpRoute(
        name: "ActionRoutes",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional },
        constraints: new
            {
                controller = "Avalanche",
                action = "(ActionTest|ActionTest2|Test)"
            }
    );


    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

その後、次のルートが定義されてしまいます...

GET api/Avalanche/ActionTest/{id}
GET api/Avalanche/ActionTest2/{id}
PUT api/Avalanche/Test/{id}
GET api/Avalanche   
POST api/Avalanche  
DELETE api/Avalanche/{id}

デフォルトの PUT ルートが選択されないのはなぜですか? デフォルトの GET とデフォルトの PUT のルーティングの違いは何ですか? 考えられるあらゆる方法で関数を装飾しようとしましたが、同じ結果が得られます。

主に、デフォルトの PUT ルートを取得する方法を知りたいです。これらのルートを変更する方法について提案があれば、コントローラーごとにルートを指定してアクション名を指定する必要がなくなります。これも素晴らしいでしょう。

ありがとう!

イアン

編集:今朝、次のルートも定義されていないことに気付きました..

GET api/Avalanche/{id}
4

1 に答える 1

1

問題の解決策を見つけてよかったです。しかし、REST サービスに関する私の学習に基づいてフィードバックを提供します。REST Web サービスのアイデアは、各 URL をリソース (またはエンティティ) に解決することであり、HttpVerb に応じて操作が決定されます。この場合、3 つの GET 操作があり、変更で正常に機能します。

しかし、コントローラーを再配置して、単一の GET 操作と単一の責任を持たせることもできると思います。これにより、保守性が向上します。例:

雪崩コントローラー

public class AvalancheController : ApiControllerBase
{
    public IEnumerable<Avalanche> GET()
    {

    }

    public void POST(Avalanche avalanche)
    {

    }
}

トップレベルですべての雪崩を処理すると想定できます。以下に定義する操作を示します。

GET : すべての雪崩を返します
POST: 新しい雪崩を挿入 します
PUT: 使用されません
DELETE: 使用されません

雪崩詳細コントローラ

public class AvalancheDetailsController : ApiControllerBase
{
    public Avalanche GET(int id)
    {

    } 


    public int PUT(int id)
    {

    }

    public int DELETE(int id)
    {

    }
}

単一の雪崩に対処することを想定できます。以下に定義する操作を示します。

GET : 単一の雪崩を返す
POST: 使用しない
PUT: 単一の雪崩を更新する
DELETE: 単一の雪崩 を削除する

ここで、コントローラー間の明確な区別があると思います。あなたが言及したOPでは、異なる GET 操作が存在する可能性がありますが、 single のみを返しますAvalanche。したがって、GET メソッドを変更して、オブジェクトを入力として受け取り、値をチェックします。つまり、

public class AvalanceRequest
{
  public int? Id {get;set;}
  public string Name {get;set;}
}


   public class AvalancheDetailsController : ApiControllerBase
    {
        public Avalanche GET(AvalanceRequest request)
        {
           //write business logic based on parameters
           if(request.Id.HasValue)
           //return avalanche;
           if(request.Name.IsNullOrEmpty())
           //return avalanche
        } 
        //other methods
  }

URL を扱っていて、WebAPI はあまり扱っていませんでしたが、ServiceStack を使用して REST サービスを開発しようとしていました。コントローラ名とは無関係に URL を添付できます。

Url
api/Avalanche --> AvalancheController (オペレーションは HttpVerb に基づいて呼び出されます)
api/Avalanche/Id --> AvalancheDetailsController (オペレーションは HttpVerb に基づいて呼び出されます)

WebAPIで同様にURLを添付できるかどうかはわかりません。そうしないと、デフォルトの構成が作成され、経由で呼び出されます。api/Avalanche および api/AvalancheDetails/id.

 config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

長い投稿で申し訳ありませんが、それが理にかなっていることを願っています。

于 2013-03-14T16:06:40.157 に答える