2014-03-02 23 views
2

我想要一種特殊的路由添加到默認的WebAPI樣品重疊路線:用的WebAPI

常規的有

/api/values(檢索所有值)

/api/values/{id}(檢索特定值(由數字ID))

現在我想添加這個API:

/api/values/special

以前的api(/api/values/{id})應該使用數字ID來提供所有請求,但/api/values/special應該提供調用該特定url的請求。

到目前爲止,我得到這個路由:

​​

而這對於實現:

public class ValuesController : ApiController 
{ 
    // GET api/values 
    public IEnumerable<string> Get() 
    { 
     return new string[] { "value1", "value2" }; 
    } 

    // GET api/values/5 
    public string Get(int id) 
    { 
     return "value"; 
    } 

    // POST api/values 
    public void Post([FromBody]string value) 
    { 
    } 

    // PUT api/values/5 
    public void Put(int id, [FromBody]string value) 
    { 
    } 

    // DELETE api/values/5 
    public void Delete(int id) 
    { 
    } 

    // GET api/values/special 
    public IEnumerable<string> SpecialValues() 
    { 
     return new string[] { "special1", "special2" }; 
    } 
} 

但它會呈現:The requested resource does not support http method 'GET'

如果我打電話/api/values/special和我添加[HttpGet]SpecialValues方法,將工作 但/api/values將停止工作,說有多個匹配操作。

回答

2

無需對WebApiConfig進行更改。附加Route屬性和HttpGet屬性。你可以閱讀更多關於它here

[HttpGet] 
[Route("api/{controller}/special")] 
public IEnumerable<string> SpecialValues() 
{ 
    return new string[] { "special1", "special2" }; 
} 

WebApiConfig -

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 } 
     ); 
    } 
} 
+0

這導致以下消息: 該請求無效。 參數字典包含'MvcApplication1.Controllers.ValuesController'中方法'System.String Get(Int32)'的非空類型'System.Int32'的參數'id'的空項。可選參數必須是引用類型,可爲空類型,或者聲明爲可選參數。 它仍然被Get方法拾取 – Fredrik

+0

您的WebApiConfig類應該在我的答案中更新。此外,你正在調用的網址應該像 - 'http://主機名:端口/ API /值/特殊' – siddharth

+1

工程就像一個魅力,我錯過了與MapHttpAttributeRoutes部分。謝謝! – Fredrik

0

是的,正如上面提到的,基於屬性的路由是去這裏的唯一途徑...

這個職位也可能感興趣的內容 Overload web api action method based on parameter type

+0

這會導致錯誤: 找到了與請求匹配的多個操作:獲取類型MvcApplication1.Controllers.ValuesController獲取類型MvcApplication1.Controllers.ValuesController – Fredrik