不同控制器中的属性路由导致"发现多个控制器类型匹配URL"

时间:2018-01-25 09:01:15

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

我正在.NET WebApi2中开发一个应用程序但是在尝试将控制器拆分为两个时,我遇到了属性路由问题。两个控制器都有一个通过/api/users/路由的操作,但一个是GET,另一个是POST

但我得到例外Multiple controller types were found that match the URL。在某种程度上它是有道理的,因为异常所说的是真的,但是因为他们有一个不同的HttpMethod,我希望这可以工作。

当将两个动作放入同一个控制器时,它工作正常,这告诉我在将URI与动作匹配时,框架确实考虑了HttpMethod。

那么有没有办法使这项工作或我被迫将两个动作都放在同一个控制器中?

[RoutePrefix("api/users")]
public class UserManagementController : ApiController 
{
    [HttpPost]
    [Route]
    public async Task<IHttpActionResult> CreateUser([FromBody] CreateUserInputModel input) 
    {
        // ...
    }
}

[RoutePrefix("api/users")]
public class UserController : ApiController
{
    [HttpGet]
    [Route]
    public async Task<IHttpActionResult> GetAllUsers() 
    {
        // ...
    }
}

1 个答案:

答案 0 :(得分:1)

路由决定了要使用的控制器。但是路由中没有任何内置(在Web API 2中,无论如何)可以区分GetPost。当请求被移交给动作调用者时,返回并更改控制器已经太晚了。

因此,要解决此问题,最好的方法是使用IHttpRouteConstraint在路线上添加更多标准,以匹配HttpGetHttpPost,然后configure it accordingly

有关示例,请参阅Multiple Controller Types with same Route prefix ASP.NET Web Api