ASP.NET MVC4 で REST API を作成していますが、ルーティングに問題があります。参考までに、私はすでにこれらの質問を読みましたが、私の問題に答えていません:
- Web API ルーティング - api/{controller}/{action}/{id} "dysfunctions" api/{controller}/{id}
- ASP.NET MVC 4 の複数の Get メソッドの Web API ルーティング
- Asp.net Mvc 4 および Web Api でのルーティング
私が作成しようとしている URL は次のようになります。
- GET /account/id (id は Guid) - GET /account/?id=x と同等
- GET /account/first%20last%20name (name は文字列) - GET /account/?name=x と同等
- GET /pendingregistrations/?page=y (ここではアクションは省略)
- POST /pendingregistrations/denyregistration?denyId=x (ここではアクションが指定されています)
ご覧のとおり、場合によっては、コントローラー名の後の URL がパラメーター (上記の 1、2 の ID と名前) にマップされ、場合によってはアクション名 (上記の 4) にマップされます。さらに、まったく存在しない可能性があります (上記の #3)。その場合、デフォルトのアクションを想定しています。ほとんどすべてのケースで機能するルーティングは次のとおりです。
// Match for an id next.
config.Routes.MapHttpRoute(
name: "WithIdApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action = "Index" },
constraints: new
{
id = @"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$"
}
);
// Match for a name next.
config.Routes.MapHttpRoute(
name: "WithNameApi",
routeTemplate: "api/{controller}/{name}",
defaults: new { action = "Index" }
);
// Match for an action last.
config.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}",
defaults: new { action = "Index" }
);
MVC は 'name' パラメーターと 'action' バインディングの違いを認識できないため、このコードは上記の例 4 を除くすべてで機能します。順序を変更すると (つまり、アクションの一致を上に置く)、'name' パラメーターの例が機能しなくなります。
これを達成できる方法を知っている人はいますか?