1. ホーム
  2. c#

[解決済み】Web Apiでリクエストに一致するアクションが複数見つかった。

2022-04-03 04:47:43

質問

2つのメソッド("Get")を持とうとすると、このエラーが発生します。

リクエストにマッチするアクションが複数見つかりました: webapi

この件に関する他の同様の質問をstackで見て回りましたが、理解できません。

私は2つの異なる名前を持っていて、"HttpGet"属性を使用しています。

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

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

解決方法は?

あなたのルートマップは、おそらく次のようなものでしょう。 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

更新しました。

さて、あなたが何を求めているのか理解できたと思うので、ここでもう1つ考えてみましょう。

おそらく、action urlパラメータは必要なく、別の方法で求めている内容を記述すべきです。メソッドが同じエンティティからデータを返していると言っているのですから、パラメータに記述させればいいのです。

例えば、あなたの2つのメソッドは、次のようになります。

public HttpResponseMessage Get()
{
    return null;
}

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

MyVmオブジェクトにどのようなデータを渡しているのでしょうか?もし、URIを通して変数を渡すことができるのであれば、そのルートを使うことをお勧めします。そうでなければ、リクエストのボディでオブジェクトを送る必要があり、それはGETを行うときに非常にHTTPではありません(それは動作しますが、MyVmの前に[FromBody]を使用するだけです)。

これで、アクション名や[HttpGet]属性を使用しなくても、ひとつのコントローラで複数のGETメソッドを使用できることがおわかりいただけたかと思います。