2016-08-10 28 views
0

私はこの質問に対する回答を見つけることができないので、ここに掲載しています。これは基本的なルーティングの質問かもしれないし、おそらく私はちょうど何かを見逃している。私はコントローラでGetAll()メソッドを持っているWebAPI2プロジェクトを持っています。私はRoutePrefixを含む属性ルーティングを使用しています。私がPostmanを使ってメソッドをテストすると、それはうまく動作しますhttp://localhost/api/v1/Suppressionsそして私のMongo DBコレクションからJSONのリストを返します。私は "リソースが見つかりません"エラーhttp://localhost/api/v1/Suppressions?name=abcを受け取ると思ったが、その代わりGetAll()メソッドを呼び出すと、URLにパラメータを追加してテストを行った。WebAPIと属性ルーティング

ルーティング中にパラメータが無視され、唯一のものが使用されます(もちろん、Get(文字列名)のようなパラメータの名前が付けられたメソッドがない限り)。その場合、誰かが誤ってパラメータまたはパラメータのリストでメソッドを呼び出した場合、GetAll()メソッドに追加する必要があるルート制約がありますか?

答えて

0

Uriで指定されていない限り、ルーティングではクエリパラメータは無視されます。 'Suppressions name = {name}'に別のルートを追加することも、既存の通話内でそれを処理することもできます。

がウリのマッチングについては、以下を参照してください。 UriTemplate.Match

+0

お返事ありがとうございます。しかし、私のメソッドGetAll()がパラメータを受け入れない場合、私の既存の呼び出しでどのように処理しますか?ルーティングがうまくいるとユーザーが判断した場合、パラメータを使用してAPIを呼び出したユーザーはどのようにわかりますか? – user2337213

+0

[HttpContext.Current.Request.QueryString](https://msdn.microsoft.com/en-us/library/system.web.httprequest.querystring(v = vs.110))を使用してクエリパラメータ値を取得できます。 aspx)。 – returnsvoid

+1

ああ、そうです。ご協力いただきありがとうございます!両方の答えは役に立ちましたが、元の質問に答えるルーティング中にクエリパラメータが無視されるという回答があるため、この回答を受け入れています。また、HttpContext.Current.Request.QueryStringを使用してパラメータを取得し、必要に応じて404を返すことができることを通知します。 – user2337213

0

それは依存しています。

説明しているような方法があるとします。たとえば、

[RoutePrefix("api")] 
public class api: ApiController { 
    [HttpGet] 
    [Route("Supressions")] 
    public HttpResponseMessage GetAll(HttpRequestMessage request){ 
     ///etc 
    } 
} 

このメソッドは、使用するパラメータに関係なく呼び出されます。あなたはこの

[RoutePrefix("api")] 
public class api: ApiController { 
    [HttpGet] 
    [Route("Supressions/{abc}")] 
    public HttpResponseMessage Get(HttpRequestMessage request, string abc){ 
     ///etc 
    } 
} 

ような何かをすれば

しかし、あなたはパラメータが必要になります。あなたが複数のパラメータを持っているとき、あなたはこのような何かを行うことができ、今

{ 
"message": "No HTTP resource was found that matches the request URI 'http://localhost:64307/api/Suppressions'.", 
"messageDetail": "No type was found that matches the controller named ''." 
} 

を、あなたはそれらを使用しない場合:あなたはそれを持っていない、あなたはhttp://localhost/api/Suppressionsを呼び出した場合、それはこのような何かを返します。

http://localhost:64307/api/Suppressions?abc=asdas&id=13&somethingElse=45

ホープTHI:あなたの呼び出しは、呼び出しはこのようなものになるだろう。ここ

[RoutePrefix("api")] 
public class api: ApiController { 
    [HttpGet] 
    [Route("Supressions")] 
    public HttpResponseMessage Get(HttpRequestMessage request, string abc, int id, int somethingElse){ 
     ///etc 
    } 
} 

にも文句を言うために起こっていますあなたの理解を助ける

+0

あなたの返事をありがとう。このシナリオでは、コントローラにパラメタのないメソッドが1つだけ存在するこのシナリオでは、コール制約がメソッドに追加される必要があります。ユーザーが何らかの理由でクエリ文字列パラメータを誤って追加した場合、GetAll()を呼び出してすべてを返し、最後に解決します。 – user2337213

+0

問題ありません。なぜユーザーはクエリ文字列を変更できるのでしょうか?それはあなたのフロントエンドルーティングフレームワークによって処理されていませんか?私には、これに制約が存在するかどうかは分かりません。 –

+0

あなたは正しいです、フロントエンドは決してパラメータでメソッドを呼び出すことはありません。郵便配達員を使用した場合、それはQAテストの問題でした。ご協力いただきありがとうございます! – user2337213

関連する問題