的WebAPI。自定义路线未按预期工作

时间:2017-04-29 10:20:28

标签: c# asp.net-web-api asp.net-web-api-routing

我正在尝试使用包含三种方法的[RoutePrefix("front")]向控制器添加自定义路由:

[HttpGet]
[ResponseType(typeof(SparePartsFrontDTO))]
public async Task<IHttpActionResult> Get()
{
    ...
}

[HttpGet]
[ResponseType(typeof(IEnumerable<SparePartSearchDTO>))]
public async Task<IHttpActionResult> Get(string filter)
{
    ...
}

[HttpGet]
[Route("categories")]
[ResponseType(typeof(IEnumerable<DeviceCategoryDTO>))]
public async Task<IHttpActionResult> GetCategories()
{
    ...
}

但是当我通过路由api/front/categories调用方法而不是自定义路由时,调用了默认的get方法。

这是WebApi配置:

config.MapHttpAttributeRoutes();
config.MessageHandlers.Add(new PreflightRequestsHandler());
config.SuppressDefaultHostAuthentication();    
config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

1 个答案:

答案 0 :(得分:1)

路由前缀需要包含所需的模板以及其他需要Route属性的操作。

[RoutePrefix("api/front")]
public class MyController : ApiController {

    [HttpGet]
    [Route("")] // matches GET api/front
    [ResponseType(typeof(SparePartsFrontDTO))]
    public async Task<IHttpActionResult> Get() {
        //...
    }

    [HttpGet]
    [Route("filter/{filter}")] // matches GET api/front/filter/anything-here
    [ResponseType(typeof(IEnumerable<SparePartSearchDTO>))]
    public async Task<IHttpActionResult> Get(string filter) {
        //...
    }

    [HttpGet]
    [Route("categories")] //matches GET api/front/categories
    [ResponseType(typeof(IEnumerable<DeviceCategoryDTO>))]
    public async Task<IHttpActionResult> GetCategories() {
        //...
    }
}

参考Attribute Routing in ASP.NET Web API 2 : Route Prefixes