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

时间:2019-01-23 20:01:16

标签: asp.net-web-api asp.net-web-api2

这就是我现在所拥有的:一条路线和到目前为止的所有控制器都对其进行确认,并且工作出色。我们希望保持原样。

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>

1 个答案:

答案 0 :(得分:0)

WebApi v2引入了路由属性,这些属性可以与Controller类一起使用,并且可以简化路由配置。

例如:

 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替换的地方。