ApiController中的属性路由奇怪行为

时间:2014-01-10 20:14:52

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

我正在使用属性路由在继承自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>

1 个答案:

答案 0 :(得分:2)

根据您的错误说明,您似乎在调用MapHttpAttributeRoutes之前已注册了常规路由。例如,您可能有config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)之类的路线。在这种情况下,api/user/someid之类的请求将匹配此路由,Web API将查找类型为UserController的控制器。请务必在此传统路线前致电MapHttpAttributeRoutes

基本规则:应在不太具体或通用的路线之前注册更具体的路线。