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




visual studio mvc モデル (12)

これはすべてが正しいことを知っている人のための答えであり、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つの "取得"メソッドを持ってしようとすると、このエラーが発生し続ける

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

私はスタックについてこれについて他の同様の質問を見ていたが、私はそれを取得しません。

私は2つの異なる名前があり、 "HttpGet"属性

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

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

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;

ウェブを検索して、ルーティングマップに最も適したフォームを見つけようとすると、

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)の両方に適用されるこれらのマッピングは、


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

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 : http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

更新:

さて、私はここであなたが何をしているのか理解していると思うので、これをもう一度やります。

アクションurlパラメータは必要ないかもしれませんし、別の方法であなたがしている内容を記述する必要があります。 メソッドが同じエンティティからデータを戻していると言っているので、パラメータを記述するだけです。

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

public HttpResponseMessage Get()
{
    return null;
}

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

どのような種類のデータをMyVmオブジェクトに渡していますか? URIを介して変数を渡すことができれば、私はそのルートに行くことを提案します。 それ以外の場合は、リクエストの本文にオブジェクトを送信する必要があります.GETを実行しているときはHTTPのようにはなりません(MyVmの[FromBody]を使用してください)。

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


異なる名前と同じパラメータを持つ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}");

最初のルートテンプレートに「アクション」パラメータがない場合でも、「通常の」WebAPIコールのルーティングと余分なアクションへのコールを分離できるように、デフォルトのアクションを設定できることに注意してください。


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はコントローラの名前です(「コントローラ」は含まれません)。 これにより、上で詳述した経路で各行動を得ることができます。

詳しい読書: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 : http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2


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

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

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


古い質問ですが、AngularJSのようなサービスリソースを使用してWebAPIに接続するときに、正しいルートを使用していることを確認する必要がありますが、このエラーは発生しません。


このソリューションは私のために働いた。

WebApiConfigにRoute2を先に配置してください。 また、各メソッドの前に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

[HttpPost / Put / Get / Delete]属性を持つデフォルトのGET | PUT | POST | DELETEアクションのコントローラメソッドを修飾しないように注意してください。 私はこのattibuteを私のバニラのポストコントローラのアクションに加えて、404を引き起こしました。

これが非常にイライラすることがあり、進歩を止めることができるので、これが誰かを助けてくれることを願っています。


私は、私は2つのGetメソッドがあるときに、1つはパラメータなしで、もう1つは複雑な型で、同じエラーが発生したことがわかりました。 私はこれを、最初のパラメータとしてIDの名前のint型の仮引数を追加し、次にcomplex型のパラメータを追加して解決しました。 次に、複合型パラメータをルートテンプレートに追加しました。 次は私のために働いた。

最初に取得する:

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 }
);






asp.net-web-api-routing