我正在使用属性路由在从系统继承的控制器中指定我的路由。网络。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 此常规路线之前。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top