WebAPI 按名称路由到控制器的特定方法

WebAPI routing to specific method of controller by name

这是我现在所拥有的:一条路线和所有控制器到目前为止都确认它并且工作得很好。我们希望保持原样。

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
                name: "DitatApi",
                routeTemplate: "api/{controller}/{action}"

现在我们创建了新的控制器,但需要以不同的方式路由它。下面是一个控制器代码以及应该如何路由这些方法。我该如何设置这样的路线?

public class CarrierController : ApiController
{
    [HttpGet]
    public object Get(string id, int? key, string direction)
    {
        return null;
    }

    [HttpPost]
    public object Update()
    {
        return null;
    }

    [HttpDelete]
    public object Delete(int key)
    {
        return null;
    }

    [HttpGet]
    public object GenerateRandomObject(int randomParam)
    {
        return null;
    }
}
  1. GET /api/carrier?id=<id>&key=<key>&direction=<direction>
  2. POST /api/carrier
  3. DELETE /api/carrier?key=<key>
  4. GET /api/carrier/random?randomParam=<random>

WebApi v2 引入了路由属性,它们可以与您的控制器一起使用class,并且可以方便路由配置。

例如:

 public class BookController : ApiController{
     //where author is a letter(a-Z) with a minimum of 5 character and 10 max.      
    [Route("html/{id}/{newAuthor:alpha:length(5,10)}")]
    public Book Get(int id, string newAuthor){
        return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
    }

   [Route("json/{id}/{newAuthor:alpha:length(5,10)}/{title}")]
   public Book Get(int id, string newAuthor, string title){
       return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
   }
...

但是,请注意查询参数 ?var1=1&var2=2 不受评估来决定使用哪个 API 方法。

WebApi 基于反射工作,因此,这意味着您的花括号 {vars} 必须与您的方法中的相同名称匹配。

因此要匹配这样的东西 api/Products/Product/test 你的模板应该像这样 "api/{controller}/{action}/{id}" 并且你的方法需要像这样声明:

[ActionName("Product")]
[HttpGet]
public object Product(string id){
   return id;
}

其中参数string namestring id代替。