0

次の3つのルートを機能させようとしています。

  • GET /api/category- すべてのカテゴリを一覧表示
  • GET /api/category/1- カテゴリ 1 の詳細を取得する
  • GET /api/category/1/questions- カテゴリ 1 から質問を取得します

このルーティングを機能させるのに問題があります。

MyCategoryControllerには、次の 3 つのメソッド定義があります。

public IEnumerable<Category> Get() {}
public Category Get(int id) {}
public IEnumerable<QuestionSummary> GetQuestions(int id) {}

これらを互いに競合させずに一致させるにはどうすればよいですか? プロジェクトの他の部分で AttributeRouting を使用しました。

4

2 に答える 2

3

以下が機能するはずです。

public static void Register(HttpConfiguration config)
{
    config.Routes.MapHttpRoute(
        name: "SubResource",
        routeTemplate: "api/{controller}/{categoryId}/{action}"
    );

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

そしてあなたのコントローラー:

public class CategoryController : ApiController
{
    public IEnumerable<Category> Get() 
    {
        ...
    }

    public Category Get(int id) 
    {
        ...
    }

    [HttpGet]
    public IEnumerable<QuestionSummary> Questions(int categoryId) 
    {
        ...
    }
}

ASP.NET Web API 2 では、.NET が可能になるため、このシナリオがはるかに簡単になりますattribute based routing

私は、Microsoft が最終的にそれを正しくするだろうと確信しています (方法ServiceStackはそれを行います)。うまくいけば、ASP.NET Web API 3 でメッセージ ベースのルーティングが導入され、REST フレームワークが正しい方法で行われるようになります。メッセージ ベースになり、それらのメッセージに対してルーティングが行われます。

于 2013-10-08T09:03:01.950 に答える
1

「アクション」を使用しない限り、同じコントローラーで同じ動詞に対して複数のメソッドを持つことはできないと思います。

適切な順序で登録する限り、3 つの異なるコントローラーを使用して 3 つのルートを処理できると思います。

config.Routes.MapHttpRoute(
    name: "Route1",
    routeTemplate: "/api/category/{id}/questions",
    controllerType: typeof(YourController1)
    );

config.Routes.MapHttpRoute(
    name: "Route2",
    routeTemplate: "/api/category/{id}",
    controllerType: typeof(YourController2)
    );  

config.Routes.MapHttpRoute(
    name: "Route3",
    routeTemplate: "/api/category",
    controllerType: typeof(YourController3)
    );
于 2013-10-08T08:59:33.010 に答える