回答:
あなたのルートマップはおそらくこのようなものです:
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メソッドを使用できることを示しています。
Web API 2以降の更新。
このAPI構成をWebApiConfig.csファイルに含めます。
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
多くのウェブを検索し、以下を見つけた場合、ルーティングマップに最も適したフォームを見つけようと試みた後
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)の両方に適用されます
Webメソッドが同じURLに解決されている可能性があります。次のリンクをご覧ください:-
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
そのため、メソッド名をルーティングテーブルに追加する必要がある場合があります。
アクションを使用しない場合のオプションは次のとおりです。
メソッドの1つを別のコントローラーに移動して、それらが衝突しないようにします。
パラメータを受け取るメソッドを1つだけ使用し、それがnullの場合はコードから他のメソッドを呼び出します。
この解決策は私にとってうまくいきました。
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
これは、すべてが正しいことを知っていて、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つの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 }
);
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;
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呼び出しのルーティングと追加のアクションへの呼び出しを分離できることに注意してください。
私の場合、すべてが正しかった
1)Web Configが適切に構成されている2)ルートプレフィックスとルート属性が適切であった
それでもエラーが発生しました。私の場合、「ルート」属性(F12キーを押す)はSystem.Web.MVcを指していましたが、System.Web.Httpではなく、問題を引き起こしていました。
古い質問であることは承知していますが、AngularJSなどのサービスリソースを使用してWebAPIに接続するときに、正しいルートを使用していることを確認してください。そうしないと、このエラーが発生します。
例=> 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
);
それでおしまい :)
次のようにしてみましたか:
[HttpGet("Summary")]
public HttpResponseMessage Summary(MyVm vm)
{
return null;
}
[HttpGet("FullDetails")]
public HttpResponseMessage FullDetails()
{
return null;
}
HttpGet
属性には文字列引数を受け入れるコンストラクターがないため、これは非.NET Coreプロジェクトではコンパイルされません。