261

2 つの「Get」メソッドを使用しようとすると、このエラーが発生し続けます

要求に一致する複数のアクションが見つかりました: webapi

スタックに関するこれに関する他の同様の質問を見回していましたが、わかりません。

私は2つの異なる名前を持ち、「HttpGet」属性を使用しています

[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}
4

18 に答える 18

524

ルート マップは、おそらくWebApiConfig.csの次のようなものです。

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

ただし、同じ http メソッドで複数のアクションを実行するには、次のようにルートを介して webapi に詳細情報を提供する必要があります。

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

routeTemplate にアクションが含まれていることに注意してください。詳細はこちら: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

アップデート:

さて、私はあなたが何であるかを理解したと思うので、ここで別の見方をします:

おそらく、action url パラメーターは必要なく、目的のコンテンツを別の方法で記述する必要があります。メソッドが同じエンティティからデータを返していると言っているので、パラメーターに説明を任せてください。

たとえば、2 つのメソッドを次のように変更できます。

public HttpResponseMessage Get()
{
    return null;
}

public HttpResponseMessage Get(MyVm vm)
{
    return null;
}

MyVm オブジェクトで渡すデータの種類は何ですか? URI を介して変数を渡すことができる場合は、その方法をお勧めします。それ以外の場合は、リクエストの本文でオブジェクトを送信する必要があり、GET を実行するときは HTTP ではありません (動作しますが、MyVm の前で [FromBody] を使用するだけです)。

これは、アクション名や [HttpGet] 属性を使用しなくても、1 つのコントローラーで複数の GET メソッドを使用できることを示しています。

于 2013-01-26T06:48:24.063 に答える
77

Web API 2 の更新。

WebApiConfig.cs ファイルでこの API 構成を使用すると、次のようになります。

public static void Register(HttpConfiguration config)
{
    //// Web API routes
    config.MapHttpAttributeRoutes(); //Don't miss this

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

次のようにコントローラーをルーティングできます。

[Route("api/ControllerName/Summary")]
[HttpGet]
public HttpResponseMessage Summary(MyVm vm)
{
    return null;
}

[Route("api/ControllerName/FullDetails")]
[HttpGet]
public HttpResponseMessage FullDetails()
{
    return null;
}

ControllerName は、コントローラーの名前です (「コントローラー」を除く)。これにより、上記のルートで各アクションを取得できます。

詳細については、http ://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 を参照してください。

于 2016-01-21T21:10:44.353 に答える
15

Web API(デフォルト)では、メソッドはHTTPメソッドとルート値の組み合わせに基づいて選択されます。

MyVm複雑なオブジェクトのように見え、本体からフォーマッターによって読み取られるため、ルートデータに関して2つの同じメソッドがあります(どちらにもルートからのパラメーターがないため)-ディスパッチャー(IHttpActionSelector)が適切なメソッドと一致することは不可能です。

あいまいさを解決するには、クエリ文字列またはルートパラメータのいずれかでそれらを区別する必要があります。

于 2013-01-26T15:45:43.570 に答える
14

Web を何度も検索し、ルーティング マップに最適なフォームを見つけようとした後、次のものが見つかった場合

config.Routes.MapHttpRoute("DefaultApiWithId", "Api/{controller}/{id}", new { id =RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "Api/{controller}/{action}");

これらのマッピングは、アクション名のマッピングと基本的な http 規則 (GET、POST、PUT、DELETE) の両方に適用されます。

于 2014-10-23T04:40:41.537 に答える
5

アクションを使用しない場合、オプションは次のようになります。

  1. メソッドの1つを別のコントローラーに移動して、衝突しないようにします。

  2. paramを受け取るメソッドを1つだけ使用し、それがnullの場合は、コードから他のメソッドを呼び出します。

于 2013-01-26T14:35:42.997 に答える
5

Web メソッドが同じ URL に解決されている可能性があります。次のリンクを見てください:-

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

そのため、メソッド名をルーティング テーブルに追加する必要がある場合があります。

于 2013-01-26T05:35:22.433 に答える
3

Web API コントローラーの代わりに MVC コントローラーを使用しているため可能です。Web API コントローラーの名前空間を確認してください。次のようにする必要があります。

using System.Net;
using System.Net.Http;
using System.Web.Http;

名前空間が次のようになっている場合、Web API コントローラー メソッドの呼び出しで上記のエラーが発生します。

using System.Web;
using System.Web.Mvc;
于 2015-11-27T11:45:00.360 に答える
3

Get メソッドが 2 つある場合、1 つはパラメーターなし、もう 1 つはパラメーターとして複雑な型を持つ場合、同じエラーが発生することがわかりました。これを解決するには、最初のパラメーターとして Id という名前の int 型のダミー パラメーターを追加し、その後に複合型パラメーターを追加しました。次に、複合型パラメーターをルート テンプレートに追加しました。以下は私のために働いた。

最初に取得:

public IEnumerable<SearchItem> Get()
{
...
}

2 番目の取得:

public IEnumerable<SearchItem> Get(int id, [FromUri] List<string> layers)
{
...
}

WebApiConfig:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{layers}",
    defaults: new { id = RouteParameter.Optional, layers RouteParameter.Optional }
);
于 2015-03-25T22:35:08.227 に答える
2

名前が異なり、パラメーターが同じ 2 つのメソッドがあることを確認してください。

その場合は、いずれかのメソッドを削除して試してください。

于 2013-07-10T18:16:17.110 に答える
2

WebAPI コントローラーを追加のアクションで拡張しようとしているときに、この問題に遭遇しました。

あなたが持っていると仮定します

public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

[HttpGet]
public void ReSeed()
{
    // Your custom action here
}

現在、TS で説明されている問題を引き起こす /api/controller の要求を満たす 2 つの方法があります。

追加のアクションに「ダミー」パラメーターを追加したくなかったので、デフォルトのアクションを調べて、次のように思いつきました。

[ActionName("builtin")]
public IEnumerable<string> Get()
{
    return this.Repository.GetAll();
}

「デュアル」ルートバインディングと組み合わせた最初のメソッドの場合:

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { action = "builtin", id = RouteParameter.Optional },
    constraints: new { id = @"\d+" });

config.Routes.MapHttpRoute(
    name: "CustomActionApi",
    routeTemplate: "api/{controller}/{action}");

最初のルート テンプレートに "action" パラメーターがないように見えますが、既定のアクションを構成して、"通常の" WebAPI 呼び出しと追加のアクションへの呼び出しのルーティングを分離できることに注意してください。

于 2015-06-04T13:03:17.570 に答える