[解決済み] Web API ルーティング - api/{controller}/{action}/{id} "dysfunctions" api/{controller}/{id}
質問
Global.asaxにデフォルトのRouteがあります。
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
特定の機能をターゲットにできるようにしたかったので、別のルートを作りました。
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
ということで、私のコントローラでは
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
呼び出し
.../api/records/bycategoryid/5
を呼び出すと、欲しいものが手に入ります。
しかし
.../api/records/1
を呼び出すと、エラーが発生します。
リクエストにマッチするアクションが複数見つかりました: ...
ルートは有効なURLを定義するだけですが、関数のマッチングに関しては、両方の
Get(int id)
と
ByCategoryId(int id)
マッチ
api/{controller}/{id}
というのは
を混乱させる
フレームワークを混乱させるものです。
デフォルトのAPIルートを再び動作させるために何をする必要がありますか?
{action}
? という名前の別のコントローラを作成しようと思いました。
RecordByCategoryIdController
という名前の別のコントローラを作成し、デフォルトのAPIルートに一致させ、それに対して
.../api/recordbycategoryid/5
. しかし、私はそれがquot;dirty"(したがって不満足な)解決策であることがわかります。これに関する答えを探しましたが、ルートで
{action}
を使用するルートについてのチュートリアルは、この問題についてさえ言及していません。
どのように解決するのですか?
ルートエンジンは、あなたがルールを追加したときと同じ順序で使用します。最初にマッチしたルールを取得すると、他のルールのチェックを止め、これをコントローラやアクションの検索に利用します。
ですから、あなたは
-
特定のルールを一般的なルール (デフォルトなど) よりも優先させる、つまり
RouteTable.Routes.MapHttpRoute
を使用して、最初に "WithActionApi"、次に "DefaultApi" をマップすることを意味します。 -
を削除します。
defaults: new { id = System.Web.Http.RouteParameter.Optional }
というのは、idがオプションになると、"/api/{part1}/{part2}"のようなurlは決して"DefaultApi"に入らなくなるからです。 -
どのアクションに入るかをルートエンジンに伝えるために、"DefaultApi"に名前付きアクションを追加してください。そうしないと、コントローラ内に複数のアクションがある場合、エンジンはどれを使うべきかわからず、 "Multiple actions were found that match the request: ..." をスローします。次に、Get メソッドと一致させるために ActionNameAttribute .
というわけで、ルートはこのようになります。
// Map this rule first
RouteTable.Routes.MapRoute(
"WithActionApi",
"api/{controller}/{action}/{id}"
);
RouteTable.Routes.MapRoute(
"DefaultApi",
"api/{controller}/{id}",
new { action="DefaultAction", id = System.Web.Http.RouteParameter.Optional }
);
そして、あなたのコントローラ。
[ActionName("DefaultAction")] //Map Action and you can name your method with any text
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
関連
-
[解決済み] Home'という名前のコントローラに一致するタイプが複数見つかりました。
-
[解決済み] ファイルまたはアセンブリ 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821' を読み込めません でした。
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] ASP.NET WebサイトとASP.NET Webアプリケーションのどちらを選ぶか?
-
[解決済み】ASP.NET Web APIでコントローラからバイナリファイルを返す。
-
[解決済み】ASP.NET web.config: configSourceとファイル属性の比較
-
[解決済み] Razorとインラインコードブロックによるif文の使用方法
-
[解決済み] Razor _layout.cshtml のファイル名の先頭にアンダースコアがあるのはなぜですか?
-
[解決済み] ASP.Net Web API の GET に複数のパラメータを渡すにはどうすればよいですか?
-
[解決済み] Web API コントローラで複数の HttpPost メソッドを使用する場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NET6新機能 - 暗黙の名前空間参照
-
net core downlink tracking skywalking インストールと使いやすいチュートリアル
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
403 - アクセス拒否。IIS7 でファイルを開くと、アクセス拒否されます。
-
[解決済み] IIS7 の「クラシック」パイプラインモードと「統合」パイプラインモードの違いは何ですか?
-
[解決済み】ASP.NET Bundles ミニフィケーションを無効にする方法
-
[解決済み] Asp.Net 4でValidateRequest="false "が動作しない。
-
[解決済み] FormsAuthentication.SignOut()がユーザーをログアウトしない
-
[解決済み] ASP.NET。HTTP エラー 500.19 - 内部サーバー エラー 0x8007000d