2013-06-19 107 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