4

この以下の質問の解決策を見つけようとすると:

デフォルト アクションの MVC Web Api ルートが機能しない

ほとんどの場合、「複数のアクションが見つかりました」という問題に遭遇します。ルーティング メカニズムがルートに一致する複数のアクションを検出すると、例外 500 がスローされます。

たとえば、ValuesController には次の 2 つのアクションがあります。

[HttpGet]
public IEnumerable<String> Active()
{
    var result = new List<string> { "active1", "active2" };
    return result;
}

public IEnumerable<string> Get()
{
    return new[] { "value1", "value2" };
}

デフォルトルートと一致するもの:

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

GET: /api/values 

複数のアクションが見つかりましたというエラーが発生します。

私の質問: 指定されたアクションを選択することで、「複数のアクションが見つかりました」という例外を回避する方法 (最初に一致したアクションを選択しても問題ありません)。

更新 1: tugberk のコメントからの更新、ご指摘ありがとうございます。

更新 2:マイクのコメントからの更新です。質問があまり正しくないようです。そのため、ルーティングの制約について言及しないように質問の仕方を変更します。

ありがとう

4

1 に答える 1

6

まず、HttpGet 属性を適用しない限り、これらのルートが Active アクションに一致することはありません。私はあなたがすでにそれをしたと仮定します。2 つ目は、必要なものが論理的ではないということです。get リクエストを作成し、2 つの同一のアクションを実行したいと考えています。現在、いわゆる HTTP メソッドベースのルーティングを使用しています。あなたの状況では、いわゆるアクションベースのルーティングが最適だと確信しています。

次の 2 つのアクションがあると仮定します。

[HttpGet]
public IEnumerable<String> Active()
{
    var result = new List<string> { "active1", "active2" };
    return result;
}

[HttpGet]
public IEnumerable<string> Retrieve()
{
    return new[] { "value1", "value2" };
}

ルートは次のようになります。

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

次に、次の URI を持つユーザーにリクエストできます。

GET /コントローラ名/取得

GET /コントローラ名/アクティブ

于 2012-07-31T12:39:36.720 に答える