web-dev-qa-db-ja.com

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

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

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

私はスタック上でこれについて他の同様の質問を見回してきたが、私はそれを得られない。

私は2つの異なる名前があり、 "HttpGet"属性を使用しています

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

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

あなたのルートマップはおそらくこのようなものです:

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のinfront [FromBody]を使用します)。

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

439
Jed

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)
{
    rturn null;
}

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

ControllerNameはコントローラの名前です( "controller"は含みません)。これにより、上記で詳述したルートで各アクションを実行することができます。

さらに読むために: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

59
Marc Stevenson

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

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

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

15
Filip W

次のことが判明した場合は、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)の両方に適用されます。

13
Moatasem bakri

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

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

そのため、ルーティングテーブルに自分のメソッド名を追加する必要があるかもしれません。

5
Max

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

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

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

5
Joanna Derks

この解決策は私のために働いた。

Route2をWebApiConfigの最初に配置してください。また、各メソッドの前にHttpGetとHttpPostを追加し、URLにコントローラ名とメソッド名を含めます。

WebApiConfig =>

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

コントローラ=>

public class ValuesController : ApiController
{

    [HttpPost]
    public string GetCustomer([FromBody] RequestModel req)
    {
        return "Customer";
    }

    [HttpPost]
    public string GetCustomerList([FromBody] RequestModel req)
    {
        return "Customer List";
    }
}

URL =>

http://localhost:7050/api/Values/GetCustomer

http://localhost:7050/api/Values/GetCustomerList
4
Alan Rezende

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;
3
Ujwal Khairnar

2つのGetメソッドがあり、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 }
);
3
Andrew Terwiel

異なる名前と同じパラメータを持つ2つの方法があることを確認してください。

もしそうなら、メソッドのいずれかを削除してみてください。

2
Ramesh

私は余分なアクションで私の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呼び出しと追加のアクションへの呼び出しのルーティングを分離することができます。

2

これはすべてが正しいことを知っていて50回チェックしたことのある人全員の答えです.....

RouteConfig.csを繰り返し見ていないことを確認してください。

編集したいファイルはWebApiConfig.csという名前です。

また、おそらくこのようになるはずです。

using System.Web.Http;

namespace My.Epic.Website
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
          config.MapHttpAttributeRoutes();

          // api/Country/WithStates
          config.Routes.MapHttpRoute(
            name: "ControllerAndActionOnly",
            routeTemplate: "api/{controller}/{action}",
            defaults: new { },
            constraints: new { action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$" });

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

私は約3時間自分自身を救うことができました。

2
CarComp

私の場合、すべて正しかった

1)Web Configが正しく設定されている2)ルートプレフィックスとルート属性が正しい

それでも私はエラーを受けていました。私の場合、(F12キーを押して) "Route"属性がSystem.Web.MVcを指していましたが、System.Web.Httpが問題ではありませんでした。

0
Hemanth Vatti

[Route("api/[controller]/[action]")]をコントローラークラスに追加できます。

[Route("api/[controller]/[action]")]
[ApiController]
public class MySuperController : ControllerBase
{
 ...
}
0
emert117

例=> TestController

        [HttpGet]
        public string TestMethod(int arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod2(string arg0)
        {
            return "";
        }

        [HttpGet]
        public string TestMethod3(int arg0,string arg1)
        {
            return "";
        }

WebApiConfig.csファイルしか変更できない場合.

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

それでおしまい :)

そして結果: enter image description here

0
Cemre Onur Baş

[HttpPost/Put/Get/Delete]属性を使用して、デフォルトのGET | PUT | POST | DELETEアクション用のControllerメソッドを装飾しないでください。この属性をVanilla Postのコントローラーアクションに追加したところ、404が発生しました。

それが非常にイライラすることができて、進歩を止めることができるので、これが誰かに役立つことを願っています。

0
ComeIn

私はそれが古い質問であることを知っています、しかし時々、あなたがWebAPIに接続するのにAngularJSからのようなサービスリソースを使うとき、あなたが正しいルートを使っていることを確かめてください。

0
Suresh Kaushik

試してみましたか?

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

[HttpGet("FullDetails")]
public HttpResponseMessage FullDetails()
{
    return null;
}
0
Deepak Shaw