ApiController中的属性路由奇怪行为
-
22-12-2019 - |
题
我正在使用属性路由在从系统继承的控制器中指定我的路由。网络。Http。ApiController。我有些古怪的行为。下面是一些示例代码:
[RoutePrefix("api/1/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
这绝对符合我的期望。当我访问~/api/1/user/someId时,我得到了预期的信息。当我切换到在路由前缀中不包含'1'时,我得到"没有找到与请求URI'baseUrl/api/user/someId'匹配的HTTP资源"。"
我有mvc路由,web api路由和属性路由都在这个项目的app start上注册,但我会认为这个控制器的默认路由是~/userrest/。..所以我不认为注册这些将是这个原因,但我可能是错的。
我想要的样本:
[RoutePrefix("api/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
我期望~/api/user/someId可以工作,但是我得到上面提到的错误("没有找到与请求URI'baseUrl/api/user/someId'匹配的HTTP资源。").
完整错误xml:
<Error>
<Message>
No HTTP resource was found that matches the request URI
'baseUrl/api/user/someId';.
</Message>
<MessageDetail>
No type was found that matches the controller named 'user'.
</MessageDetail>
</Error>
解决方案
根据您的错误描述,您似乎在调用MapHttpAttributeRoutes之前注册了常规路由。例如,您可能有一个类似的路由 config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
.在这种情况下,请求如下 api/user/someid
将匹配此路由,Web API将查找类型的控制器 UserController
.一定要打电话 MapHttpAttributeRoutes
此常规路线之前。
基本规则:更具体的路由应该在不太具体或通用的路由之前注册。
不隶属于 StackOverflow