不同控制器中的属性路由导致 "Multiple controller types were found that match the URL"
Attribute routing in different controllers results in "Multiple controller types were found that match the URL"
我正在 .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()
{
// ...
}
}
路由决定了使用哪个控制器。但是没有内置路由(在 Web API 2 中)可以分辨 Get
和 Post
之间的区别。当请求被移交给动作调用者时,已经来不及返回并更改控制器了。
因此,要解决此问题,最好的选择是使用 IHttpRouteConstraint
在路由上放置进一步的条件是否匹配 HttpGet
或 HttpPost
然后 configure it accordingly。
有关示例,请参阅 Multiple Controller Types with same Route prefix ASP.NET Web Api。
我正在 .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()
{
// ...
}
}
路由决定了使用哪个控制器。但是没有内置路由(在 Web API 2 中)可以分辨 Get
和 Post
之间的区别。当请求被移交给动作调用者时,已经来不及返回并更改控制器了。
因此,要解决此问题,最好的选择是使用 IHttpRouteConstraint
在路由上放置进一步的条件是否匹配 HttpGet
或 HttpPost
然后 configure it accordingly。
有关示例,请参阅 Multiple Controller Types with same Route prefix ASP.NET Web Api。