次の2つのルート設定があり、有効なリクエストが送信されたときに正常に動作しています。ASP.NET MVCで文字列IDを許可する
config.Routes.MapHttpRoute("DefaultApiWithId", "{controller}/{id}", new { id = RouteParameter.Optional }, new { id = @"\d+" });
config.Routes.MapHttpRoute("DefaultApiWithAction", "{controller}/{action}");
私は、応答が正しいことを確認するためにいくつかの悪い要求をテストしたかったのです。私は自分のコントローラーで次のアクションを呼び出そうとしています。
public HttpResponseMessage Get(string id)
{
//output the id again
}
私はlocalhost:80/users/123
を呼び出すと、私は有効であり、それが出力123
意志バック応答を得ます。私が無効なID
を使用しようとすると、たとえば、文字を含むものが次のエラーで失敗します。
{「メッセージ」:「いいえHTTPリソースが見つからなかったリクエストURI 『http://localhost:80/users/d1g』にマッチします。」、「MessageDetail」: "アクションなしに名前が一致するコントローラ『ユーザー』に関する 見つかりませんでした" "}
私は何がうまくいかないのか分かります。このリクエストは、最初のルートに一致する必要がありますが、代わりに2番目のルートに一致している必要があります。私はGet
という2つの方法があります。 1つはID
を受け取り、もう1つはID
を必要としません。 ID
を必要としないものはすべてのレコードのリストを返します。私はこれに多くの問題を抱えていました。上記のルートは私がどのように問題を解決したかです。
最初のルートと一致しないはずです。そのルートには、idパラメータに 'new {id = @" \ d + "}"という数だけの制約があります。そして、それは2番目のルートマッピングと衝突しないようになっています – Nkosi
私は最初のGETのために、ここでマスクを指定しました: 'new {id = @" \ d + "}'、それを削除してみてください。しかし、私は単純な決定でただ一つのメソッドを持つべきだと思います: 'ID'が渡された場合はObjectを返し、そうでなければリストを返します。しかし、私は別の方法を取るだろう。 –
私は制約を削除する場合、 "要求に一致する複数のアクションが見つかりました:\ r \ nSystem.Net.Http.HttpResponseMessage Get()"というエラーが発生します。私は2つのメソッドを取得するので、これは理にかなっています。レコードのリストを返すためにidと別のものを取るもの –