你看过使用属性路由吗?我们现在广泛使用属性路由,以至于我们完全摆脱了使用 MapHttpRoute 的默认 /controller/action 类型路由。
相反,我们如下装饰我们的控制器。首先,我们为控制器创建一个路由前缀,以便我们知道我们需要的基本路由是什么
/// <summary> A controller for handling products. </summary>
[RoutePrefix("api/purchasing/locations/{locationid}/products")]
public class ProductsController : PurchasingController
{
然后对于控制器中的每个动作,我们将其装饰如下:
[Route("", Name = "GetAllProducts")]
public IHttpActionResult GetAllProducts(int locationid, ODataQueryOptions<FourthPurchasingAPI.Models.Product> queryOptions)
{
IList<Product> products = this.GetProducts(locationid);
和
[Route("{productid}", Name = "GetProductById")]
public IHttpActionResult GetProduct(int locationid, string productid)
{
Product product = this.GetProductByID(locationid, productid);
所以对api/purchasing/locations/1/products/的调用将解析为名为“GetAllProducts”的路由,对api/purchasing/locations/1/products/1的调用 将解析为名为“GetProductById”的路由
然后,您可以在控制器中创建另一个具有相同签名的 GetProduct 操作,只需适当地设置属性路由,例如
[Route("/department/{departmentId}", Name = "GetAllProductsForDepartment")]
public IHttpActionResult GetAllProductsWithDeptId(int locationid, int departmentId)
{
IList<Product> products = this.GetProducts(locationid, departmentId);
现在调用 api/purchasing/locations/1/products/department/1234将解析到名为“GetAllProductsForDepartment”的路由
我知道这个示例使用的是 Web Api 2,但请查看此链接以获取 Web Api 中的属性路由。它应该完全相同,而不是您将返回 IHttpActionResult 以外的其他内容。