2013-06-19 52 views
3

這裏是我的代碼:Asp.Net的Web API路由不打自定義操作

public class SecurityController : ApiController 
{ 
    //GET api/Security/Current 
    public HttpResponseMessage GetCurrent(){ 

    } 
    //POST api/Security/Login 
    public HttpResponseMessage PostLogin(LoginModel model){ 

    } 
} 

public class OrdersController : ApiController 
{ 
    [ActionName("Default")] //GET api/Orders 
    public HttpResponseMessage Get(){ 

    } 

    [ActionName("Default")] //GET api/Orders/2 
    public HttpResponseMessage Get(long id){ 

    } 

    [ActionName("Default")] //POST api/Orders/ 
    public HttpResponseMessage Post(Order order){ 

    } 

    [ActionName("Default")] //DELETE api/Orders/2 
    public HttpResponseMessage Delete(long id){ 

    } 
    [HttpPost] //POST api/Orders/2/PerformAction 
    public HttpResponseMessage PerformAction(long id, ActionMsg action){ 

    } 

} 

//路由定義

 config.Routes.MapHttpRoute("ActionApi", "api/{controller}/{action}"); 
     config.Routes.MapHttpRoute("WithActionApi", "api/{controller}/{id}/{action}"); 
     config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional, action = "Default" }, new { id = @"\d+" }); 

我的路由不工作。

No HTTP resource was found that matches the request URI 

我的API控制器的正確路由定義是什麼? 謝謝!

+0

你使用什麼URL?你爲什麼使用[ActionName(Default)]? – jzm

+0

我假設路由將映射到具有相同操作名稱的控制器中的操作。也就是說,如果ActionName屬性帶有動作,那麼可以使用config.Routes.MapHttpRoute(「DefaultApi」,「api/{controller}/{id}」,new {id = RouteParameter.Optional,action =「Default」},new {id = @「\ d +」});'將用於路由 – SamSerious

回答

6

您SecurityController更改爲:

public class SecurityController : ApiController 
{ 
    //GET api/Security/Current 
    [HttpGet] 
    [ActionName("current")] 
    public HttpResponseMessage GetCurrent(){ 

    } 
    //POST api/Security/Login 
    [HttpPost] 
    [ActionName("login")] 
    public HttpResponseMessage PostLogin(LoginModel model){ 

    } 
} 

,然後改變你的路由:

config.Routes.MapHttpRoute("ActionApi", 
    "api/{controller}/{action}", 
    null, 
    new { action = @"[a-zA-Z]+" }); 

config.Routes.MapHttpRoute("WithActionApi", 
    "api/{controller}/{id}/{action}"); 

config.Routes.MapHttpRoute("DefaultApi", 
    "api/{controller}/{id}", 
    new { id = RouteParameter.Optional, action = "Default" }, 
    new { id = @"\d*" }); 

注意正則表達式「\ d *」是最後一個路徑而不是「\ d +」所必需的。

+0

工作!謝謝! – SamSerious

0

請刪除:[ActionName("Default")]

你的路由定義沒有提到它。事實上,一般來說,你根本不需要動作名稱。

隨着ActionName取出,並用"api/{controller}/{action}"路線,你應該能夠打到使用http://url/api/orders的行動,它將調用public HttpResponseMessage Get()

+0

沒有工作。除了'api/Orders/2/PerformAction'全都拋出404 – SamSerious