2017-02-10 18 views
3

次の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を必要としないものはすべてのレコードのリストを返します。私はこれに多くの問題を抱えていました。上記のルートは私がどのように問題を解決したかです。

+0

最初のルートと一致しないはずです。そのルートには、idパラメータに 'new {id = @" \ d + "}"という数だけの制約があります。そして、それは2番目のルートマッピングと衝突しないようになっています – Nkosi

+0

私は最初のGETのために、ここでマスクを指定しました: 'new {id = @" \ d + "}'、それを削除してみてください。しかし、私は単純な決定でただ一つのメソッドを持つべきだと思います: 'ID'が渡された場合はObjectを返し、そうでなければリストを返します。しかし、私は別の方法を取るだろう。 –

+0

私は制約を削除する場合、 "要求に一致する複数のアクションが見つかりました:\ r \ nSystem.Net.Http.HttpResponseMessage Get()"というエラーが発生します。私は2つのメソッドを取得するので、これは理にかなっています。レコードのリストを返すためにidと別のものを取るもの –

答えて

2

制約を削除し、経路を更新して競合を回避し、競合を回避して順序を切り替えることで、経路を更新します。

config.Routes.MapHttpRoute(
    "DefaultApiWithAction", 
    "{controller}/{action}/{id}" 
    new { id = RouteParameter.Optional } 
); 

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "{controller}/{id}", 
    new { action = "Get", id = RouteParameter.Optional } 
); 
+0

これで問題は解決されましたが、以前と同じ問題が発生します。要求に一致する複数のアクションが見つかりました:\ r \ nSystem.Net.Http.HttpResponseMessageタイプでGet()。私はこのコントローラのように1つのコントローラを動作させたいと思っています。コントローラの/ controller/id = call get(string id) –

+0

ビンゴ、これは仕事です。理由はDunnoですが、取得するアクションをハードコーディングすると問題が発生すると思っていましたが、これは完全に機能しているようです –

関連する問題