1、在App_Start
文件夹下面的WebApiConfig
,默认路由配置为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace testAPI
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableSystemDiagnosticsTracing();
}
}
}
url:api/{controller}/{id}
2、在控制器里面添加一个get
请求:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace testAPI.Controllers
{
public class ValuesController : ApiController
{
[HttpGet]
public string Get1()
{
return "value1";
}
}
}
3、启动项目,浏览器测试:
可以看到通过get
请求获取到了数据
4、在控制器里面再添加一个get
请求:
public class ValuesController : ApiController
{
[HttpGet]
public string Get1()
{
return "value1";
}
public string Get2()
{
return "value2";
}
}
启动项目,浏览器测试:
我们发现发生错误:找到了与该请求匹配的多个操作
那要怎么处理呢,把第二个方法改成post请求:
public class ValuesController : ApiController
{
[HttpGet]
public string Get1()
{
return "value1";
}
[HttpPost]
public string Get2()
{
return "value2";
}
}
测试请求:
可以正确获取到数据,且如果是post请求返回Get2
的信息,如果是get
请求返回Get1
的信息;
从上面两个测试我们可以得出如下结论:
当多个action
的 请求方式一样的话,在默认路由模板下(没有action
),将会匹配多个操作。 基于上面两点结论,默认路由模板无法满足针对一种资源一种请求方式的多种操作。
5、自定义一个路由:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//自定义路由:匹配到action
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "actionapi/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableSystemDiagnosticsTracing();
}
}
控制器方法:
public class ValuesController : ApiController
{
public string Get1()
{
return "value1";
}
public string Get2()
{
return "value2";
}
}
测试:
请求http://localhost:26753/actionapi/values返回404错误;
请求http://localhost:26753/actionapi/values/get1返回Get1的信息;
请求http://localhost:26753/actionapi/values/get2返回Get2的信息;
通过定制路由模板我们可以得出如下结论:
通过在路由模板中增加action
目录,对资源的定位直接作用到action
上。 多个HttpGet
方法可以共存于一个controller
中。
特性路由主要处理一些比较复杂的请求url
,如资源之间存在嵌套关系:客户包含订单,书有作者属性等等。对于这种Uri
,我们希望的路由是这样的:/costomers/{customerid}/orders
或 /costomers/{customerid}/orders/{orderid}
考虑到这只是某个Controller
的路由格式,而我们会有很多个Controller
,用基于约定路由显然不合适(要配置很多的路由)
使用特性路由就简单了,在action
上加一个特性即可
[Route("customers/{productId}/orders")]
public string getProductName(int productId)
{
return "name";
}
使用特性路由需要在WebApiConfig
中添加config.MapHttpAttributeRoutes();
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
...
}
}