簡體   English   中英

Web API 路由無法識別參數

[英]Web API Routing Not Recognising Parameters

我有以下 WebAPI 控制器:

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

但是,我嘗試指定 URL:

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

如果我像這樣指定 URL:

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

然后它打破了路由。

顯然我遺漏了一些關於路由的東西; 請有人能指出我正確的方向嗎?

您正在使用多個可選參數,這些參數不適用於 routeTemplates。 通常最后一個參數往往是可選參數。

文檔: ASP.NET Web API 2 中的屬性路由:可選的 URI 參數和默認值

首先確保啟用了屬性路由

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) { ... }
}

您可以嘗試在 Get() 方法的 params 中使用[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)
        {

希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM