我正在使用属性路由在继承自System.Web.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匹配的HTTP资源'baseUrl / api / user / someId'。”
我有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匹配的HTTP资源'baseUrl / api / user / someId'。”)。 / p>
完整错误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>
答案 0 :(得分:2)
根据您的错误说明,您似乎在调用MapHttpAttributeRoutes之前已注册了常规路由。例如,您可能有config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
之类的路线。在这种情况下,api/user/someid
之类的请求将匹配此路由,Web API将查找类型为UserController
的控制器。请务必在此传统路线前致电MapHttpAttributeRoutes
。
基本规则:应在不太具体或通用的路线之前注册更具体的路线。