2

我有以下的WebAPI控制器:的Web API路由不能識別參數

namespace MyApp.WebApi.Controllers 
{ 
    [RoutePrefix("api/listing")] 
    public class ListingController : ApiController 
    { 
     [Route("{firstparam:int?}/{nextparam:int?}")] 
     public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) 
     { 
      // firstparam is always 100, and nextparam is always 12 

不過,我已經試過指定的網址:

http://localhost:56004/#/listing?firstparam=2 

如果我指定這樣的網址:

http://localhost:56004/#/listing/2 

然後它打破了路由。

很明顯我錯過了一些關於路由;請有人指出我在正確的方向?

回答

1

您正在使用多個可選參數,這些參數對routeTemplates不起作用。通常最後一個參數往往是可選參數。

文檔:Attribute Routing in ASP.NET Web API 2: Optional URI Parameters and Default Values

首先確保該屬性路由啓用

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

爲了得到你所追求的

[RoutePrefix("api/listing")] 
public class ListingController : ApiController { 

    //GET api/listing 
    //GET api/listing?firstparam=x 
    //GET api/listing?nextparam=y 
    //GET api/listing?firstparam=x&nextparam=y 
    [HttpGet] 
    [Route("")] 
    public IEnumerable<ListItem> Get(int firstparam = 100, int nextparam = 12) { ... } 
} 

具有多個內嵌參數是可選的問題路由器不知道要使用哪個,這就是爲什麼他們傾向於在URL的末尾。

但是爲了讓他們像你在你的例子中提到的那樣內聯,你將需要多條路線。

[RoutePrefix("api/listing")] 
public class ListingController : ApiController { 

    //GET api/listing 
    [HttpGet] 
    [Route("")] 
    public IEnumerable<ListItem> Get() { return Get(100, 12); } 

    //GET api/listing/2 
    //GET api/listing/2/5 
    [HttpGet] 
    [Route("{firstparam:int}/{nextparam:int?}")] 
    public IEnumerable<ListItem> Get(int firstparam, int nextparam = 12) { ... } 
} 
0

您可以嘗試在Get()方法的參數中使用[FromUri]屬性,以提取任何傳遞到「/ listing」uri中的查詢參數以及由int屬性firstparam和secondparam組成的類。

namespace MyApp.WebApi.Controllers 
{ 
    [RoutePrefix("api/listing")] 
    public class ListingController : ApiController 
    { 
     [Route("")] 
     [HttpGet] 
     public IEnumerable<ListItem> Get([FromUri] ClassRepresentingParams params) 
     { 

希望有幫助。

+0

這樣的URL會是什麼樣子?它似乎打破了路由(也就是說,它找不到Get) –

+0

嘗試向該方法添加[HttpGet]屬性。我已經更新了我的答案。 –

+0

HttpGet(「」)不能編譯。沒有引號就沒有區別,我仍然失去了路由 –