2017-02-23 75 views
2

我有這個網頁API控制器:網頁API屬性與可選參數和查詢路由參數

[RoutePrefix("api/product")] 
public class ProductController : ApiController 
{ 
    [HttpGet, Route("{id?}")] 
    public async Task<HttpResponseMessage> GetProduct([FromUri] string param1 = null, [FromUri] string param2 = null, Guid? id = null) 
    { 
     ...  
    } 
} 

我想通過這些URI訪問:
API /產品/參數1 =東西&參數2 = SMT

API /產品/ 7b55fcee-21e7-4b10-80e3-42b4d9cf913d?參數1 =東西&參數2 = SMT

但是,第一個uri不工作,路由參數的默認值未設置。
這個URI作品:
API /產品/空參數1 =東西&參數2 = SMT
沒有這一項:??
API /產品/參數1 =東西&參數2 = SMT

我試圖使用類型「字符串」的路由參數,但它仍然沒有工作。

它是參數的順序嗎?
還是我誤解了一些關於Web Api路由映射的內容?

編輯: 我WebApiConfig.cs不包含默認路由:

public static class EdmWebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     if (config == null) throw new ArgumentNullException(nameof(config)); 

     // Attribute routing 
     config.MapHttpAttributeRoutes(); 

     ... 
     some declaration of formatters 
     ... 
    } 
} 

我應該聲明默認路由?
在我看來,因爲我使用了屬性映射,所以我不需要那樣做。

我試圖改變我的路由這樣的:

[RoutePrefix("api")] 
public class ProductController : ApiController 
{ 

    [HttpGet, Route("product/get/{id?}")] 
    public async Task<HttpResponseMessage> GetProduct([FromUri] Guid param1, [FromUri] string param2, Guid? id = null) 
    { 
     ... 
    } 
} 

此URI API /產品/得/參數1 =東西&參數2 = SMT仍然無法正常工作。
(我試過API /產品/?參數1 =東西&參數2 = SMT與相關的路由,不工作)

我需要聲明我WebApiConfig.cs默認路由?
你可以在WebApiConfig.cs中做什麼,你應該可以在屬性路由中做到這一點,不是嗎?像可選參數,約束,...

+0

您的WebApiConfig.cs文件中是否配置了任何路由?是否可以提供路由配置。謝謝 –

回答

0

您的路由前綴過於具體。我相信你想要:

[RoutePrefix("api")] 
public class ProductController : ApiController 
{ 
    [HttpGet, Route("product/{id?}")] 
    public async Task<HttpResponseMessage> GetProduct([FromUri] string param1 = null, [FromUri] string param2 = null, Guid? id = null) 
    { 
     ...  
    } 
} 

這應該適合你。路由前綴不是本身的路由,因此默認路由應該不太具體。

0

我不能重建這個錯誤,但我想推薦一個更好的模式供您遵循。

您有一種過於籠統的方法,在做實際工作之前需要對參數進行重大檢查。

如果你有兩個單獨的端點,那會更好。 一般Get方法,如:

Get([FromUri] string keyword = null)

而另一個如:

GetById(Guid id)

您設置的方式你RoutePrefix是正確的,你不需要去改變它。