次の手順でこの問題を見つけました。
インストールされたプロジェクト テンプレートを使用して新しい WebApi プロジェクトを作成する
Controllers/ValuesController.cs に移動します。次のような 2 つのGetメソッドがあります。
public IEnumerable<string> Get()
// これはGetAll関数を提供しますpublic string Get(int id)
// これはGetOneById です2 つの API メソッドを 1 つに組み合わせることができると思うので、この設計は好きではありません。
public IEnumerable<string> Get(string ids)
ids が null の場合、すべてのレコードを返します。それ以外の場合は、ids (id1、id2、id3 のようになります) によって結果を返します。
ルートも変更しました:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{ids}",
defaults: new { ids = RouteParameter.Optional }
);
これですべての準備が整ったと思います。ただし/values
、ブラウザーで (ids パラメーターを指定せずに) にアクセスすると、次のデフォルト値を追加するまで、「アクションが見つかりませんでした」と言われましたids
。
public IEnumerable<string> Get(string ids = null)
これからは、すべてが期待どおりに機能します。それでもdefaults
、ルート内のパラメーターを移動できません。つまり、コードは ids パラメータをオプションとして 2 回宣言しています。
method にある MVC4 のソース コードを調べると、適切な actionSystem.Web.Http.Controllers.ActionSelectorCacheItem.FindActionUsingRouteAndQueryParameters
を見つけるときに、ルートで定義されたオプションのパラメーターが無視されていることがわかります。個人的には、これは本当に悪いことだと思います。回避策は非常に簡単です。それとも、ルートとアクション メソッドの関係を誤解していましたか? ルートは、リクエストが対応するアクションを見つけるのを助けるために使用されるルールであると考えていますが、「パラメーターはオプションです」はまさにルールの一部です。