次のWeb APIコントローラーのルーティングを行う方法を考えています。
public class MyController : ApiController
{
// POST api/MyController/GetAllRows/userName/tableName
[HttpPost]
public List<MyRows> GetAllRows(string userName, string tableName)
{
...
}
// POST api/MyController/GetRowsOfType/userName/tableName/rowType
[HttpPost]
public List<MyRows> GetRowsOfType(string userName, string tableName, string rowType)
{
...
}
}
現時点では、URLにこのルーティングを使用しています。
routes.MapHttpRoute("AllRows", "api/{controller}/{action}/{userName}/{tableName}",
new
{
userName= UrlParameter.Optional,
tableName = UrlParameter.Optional
});
routes.MapHttpRoute("RowsByType", "api/{controller}/{action}/{userName}/{tableName}/{rowType}",
new
{
userName= UrlParameter.Optional,
tableName = UrlParameter.Optional,
rowType= UrlParameter.Optional
});
ただし、現時点では最初のメソッド(2つのパラメーター)のみが機能しています。私は正しい行ですか、またはURL形式またはルーティングが完全に間違っていますか?ルーティングは私にとって黒魔術のようです...
問題はあなたのapi/MyController/GetRowsOfType/userName/tableName/rowType
URLは常に最初のルートに一致するため、2番目のルートには到達しません。
単純な修正、最初にRowsByType
ルートを登録します。
WebApiConfigget(out of control "with何百ものルートが配置されています。
代わりに、私は個人的に Attribute Routing を好みます
POST and GETと混同している
[HttpPost]
public List<MyRows> GetAllRows(string userName, string tableName)
{
...
}
HttpPostANDGetAllRows?
代わりにこれをしない理由:
[Route("GetAllRows/{user}/{table}")]
public List<MyRows> GetAllRows(string userName, string tableName)
{
...
}
または、Route( "PostAllRows"とPostRowsに変更します。実際にGETリクエストを実行しているので、表示するコードが機能するはずです。 、しかしメソッド自体、その名前は好きなものにすることができます。呼び出し元がROUTEのURLに一致する限り、本当に必要な場合はメソッドのGetMyStuffを入れることができます。
更新:
私は実際にexplicit
であり、HTTP methods
ANDルートパラメータをメソッドパラメータに一致させたい
[HttpPost]
[Route("api/lead/{vendorNumber}/{recordLocator}")]
public IHttpActionResult GetLead(string vendorNumber, string recordLocator)
{ .... }
(ルートlead
はメソッド名GetLead
と一致する必要はありませんが、順序を変更することもできますが(例えばrecord recordなど)、同じ名前をルートパラメーターとメソッドパラメーターに保持する必要があります。ルートが反対の場合でも、vendorNumberの前に-私はそれをしません。
ボーナス:ルートでも常に正規表現を使用できるようになりました、例
[Route("api/utilities/{vendorId:int}/{utilityType:regex(^(?i)(Gas)|(Electric)$)}/{accountType:regex(^(?i)(Residential)|(Business)$)}")]
public IHttpActionResult GetUtilityList(int vendorId, string utilityType, string accountType)
{