【问题标题】:Custom WebApi routing not working自定义 WebApi 路由不起作用
【发布时间】:2016-05-10 13:11:35
【问题描述】:

我正在尝试为 Web api 控制器创建自定义路由:

[System.Web.Http.RoutePrefix("api/admin")]
public class AdminApiController : BaseApiController
{
    [Route("~/echo")]
    public string Echo()
    {
        return "Hello World";
    }
}

我希望转到 http://example.com/api/admin/echo 并收到“Hello world”,但结果却收到错误消息:

<Error>
    <Message>
        No HTTP resource was found that matches the request URI 'http://example.com/api/admin/echo'.
    </Message>
    <MessageDetail>
    No type was found that matches the controller named 'admin'.
    </MessageDetail>
</Error>

【问题讨论】:

    标签: model-view-controller asp.net-web-api asp.net-mvc-5 asp.net-mvc-routing asp.net-web-api2


    【解决方案1】:

    替换波浪号 (~)

    方法属性上的波浪号 (~) 覆盖 route prefix控制器:

    [RoutePrefix("api/admin")]
    public class AdminApiController : BaseApiController {
        // GET /api/admin/echo
        [HttpGet]
        [Route("echo")] 
        public string Echo() {
            return "Hello World";
        }
        // GET /echo
        [HttpGet]
        [Route("~/echo")]
        public string Echo2() {
            return "Hello World 2";
        }
    }
    

    为了安全起见,您还需要确保您Enable Attribute Routing

    要启用属性路由,请在配置期间调用 MapHttpAttributeRoutes。此扩展方法在 System.Web.Http.HttpConfigurationExtensions 类中定义。

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            // Attribute routing.
            config.MapHttpAttributeRoutes();
    
            // Convention-based routing.
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    

    【讨论】:

    • 当我使用你的建议时,我会在去sample.com/api/admin/echo时得到The requested resource does not support http method 'GET'
    • @Andrey 我更新了答案以包含HttpGetAttribute
    • 其实路由前缀还是不行。它在控制器被命名为 AdminController 时起作用。当它被命名为 AdminApiController 时,我不得不使用 /api/adminAPI/echo url 而不是 api/admin/echo - 任何想法为什么?
    • 您是否配置了映射?我也在答案中提供了这一点。
    • 你的意思是我运行 config.MapHttpAttributeRoutes() - 是的。我没有显式添加任何自定义映射,因为我假设 RoutePrefix 将覆盖控制器名称 - 否则我们为什么需要 RoutePrefix?
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 2019-01-05
    相关资源
    最近更新 更多