2016-08-10 105 views
0

我似乎無法找到這個問題的答案,所以我在這裏發佈它。這可能是一個基本的路由問題,也許我只是想念一些明顯的東西。我有一個WebAPI2項目,在控制器中有GetAll()方法。我正在使用包含RoutePrefix的屬性路由。當我使用Postman測試該方法時,它工作正常http://localhost/api/v1/Suppressions並且它從我的Mongo DB集合中返回一個JSON列表。偶然在測試過程中,我碰巧測試並向URL添加了一個參數,認爲我會收到「無法找到資源」錯誤http://localhost/api/v1/Suppressions?name=abc,但它改爲調用GetAll()方法。WebAPI和屬性路由

在路由過程中,參數被忽略,並且是唯一使用的URI(除非我有一個專門命名參數的方法,比如Get(string name))?如果是這樣的話,是否有一個路由約束,我需要添加到我的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 
    } 
} 

您需要的參數。如果沒有它,你叫http://localhost/api/Suppressions,它將返回是這樣的:

{ 
"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 ''." 
} 

現在,當你有多個參數,你可以做這樣的事情,如果你不使用它們你的電話,它會抱怨以及

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

這裏的調用將是這樣的:

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

希望THI s幫助你瞭解

+0

感謝您的回覆。因此,通常情況下,在這種情況下,控制器中只有一個方法是無參數的,是否存在路由約束或需要添加到方法中的某些內容,以便驗證呼叫是否正確路由到方法,或者我應該不關心和如果用戶由於某種原因無意中添加了查詢字符串參數,它只是調用GetAll()並返回所有內容,並將它們修復到最終? – user2337213

+0

沒問題。爲什麼用戶能夠修改查詢字符串?這不是由您的前端路由框架處理嗎?我不知道這是否存在限制。 –

+0

你是對的,前端永遠不會調用帶參數的方法。當使用Postman時,這更像是一次QA測試。謝謝你的幫助! – user2337213