2017-06-21 30 views
0

重載Get方法路由問題,我有產品控制器2種Get方法如下:用的WebAPI

public IHttpActionResult Get(string keywordSearch) 

[Route("api/Product/{id:long}")] 
public IHttpActionResult Get(long id) 

以下網址的工作原理:

http://localhost:61577/api/Product?keywordSearch=test 
http://localhost:61577/api/Product/1 

這一次失敗,與消息:

http://localhost:61577/api/Product/test 

{  
"Message": "No HTTP resource was found that matches the request URI 'http://localhost:61577/api/Product/test'.", 
"MessageDetail": "No action was found on the controller 'Product' that matches the request." 
} 

WebApiConfig.cs具有以下配置:

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

請指教,我應該在API函數或配置中做什麼修改才能使其工作。

回答

1

你需要在你的路由配置到指定路線兩種操作方法是這樣的:

// for number type parameter only 
config.Routes.MapHttpRoute(
    name: "IdSearch", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: null, 
    constraints: new { id = @"^\d+$" } // Only integers 
); 

再註冊另一個用於字符串參數:

// for string parameter overload action route 
config.Routes.MapHttpRoute(
    name: "KeyWordSearch", 
    routeTemplate: "api/{controller}/{keywordSearch}", 
    defaults: null 
); 

,並在你的行動聲明在字符串參數過載1上應用屬性值,以使兩者看起來像:

[Route("api/Product/{keywordSearch}")] 
public IHttpActionResult Get(string keywordSearch) 

[Route("api/Product/{id:long}")] 
public IHttpActionResult Get(long id) 

另一種方法是,你可以用你的控制器類RoutePrefix,然後Route屬性上的動作方法,讓你不必重複路由的前綴上的每個動作方法:

[RoutePrefix("api/product")] 
public class ProductController : ApiController 
{ 
    [Route("{keywordSearch}")] 
    public IHttpActionResult Get(string keywordSearch) 

    [Route("{id:long}")] 
    public IHttpActionResult Get(long id) 
} 

這應該讓你繼續前進。

希望它有幫助!

+0

**您的解決方案對我有幫助**我在代碼中做了以下更改並且它變得功能正常。 1.增加RoutePrefix '[RoutePrefix( 「API /產物」)]'' 公共類ProductController的:ApiController' 2.添加的路由 '〔路線( 「{keywordSearch}」)]'' 公共IHttpActionResult獲取(string keywordSearch)' – AaBa

+0

將以第二種方式更新答案 –