【问题标题】:WebAPI route without controller tag没有控制器标签的 WebAPI 路由
【发布时间】:2012-10-12 06:56:44
【问题描述】:

我正在尝试 WebAPI,到目前为止,我印象深刻,但在路由方面遇到了麻烦。 我有这条可行的路线:

routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{query}",
            defaults: new { query = RouteParameter.Optional });

然而,我想要一个“其他”控制器(如果没有找到控制器,请使用这个),我当前的(非工作)路径是:

routes.MapHttpRoute(
            name: "ElseApi",
            routeTemplate: "api/g/{identifier}",
            defaults: new {
                controller = "Else",
                action = "Generalise",
                identifier = RouteParameter.Optional});

在我的 ElseController 中使用以下方法:

public string Generalise(string identifier)
        {
            return "gen";
        }

可能是什么问题?不断收到 404 错误...

【问题讨论】:

    标签: routing asp.net-web-api


    【解决方案1】:

    请记住按正确顺序添加路线。

    路由机制使用它可以匹配的第一个路由,所以如果首先定义了"api/{controller}/{action}/{query}" 路由,那么像api/g/1 这样的调用也将使用这个路由,而不是第二个。

    这里的经验法则是首先定义最具体的路线,最后定义最一般的路线 - 您也可以阅读 this answer 了解更多详细信息。

    【讨论】:

    • 我明白,但我没有'g'控制器,我想要实现的是拥有一个可以采用多条路径的控制器......我的查询不会指定动作或任何东西,它只会说 /api/g/operator,然后我想将运算符作为字符串接收到我的方法中。这可能吗?
    • @AdriaanDavel 请仔细阅读我的回答,这都是关于路线顺序的。在您的情况下,您已将 "api/{controller}/{action}/{query}" 定义为第一条路线,因此它是框架将使用的路线。你没有'g'控制器,所以它会失败。但是,如果您将"api/g/{identifier}" 定义为第一条路由,那么像/api/g/operator 这样的调用将被定向到控制器Else 和动作Generalise,而每个不是以'/api/g/...' 开头的动作将被这条路线跳过,并由第二条更通用的路线进行分析。
    • 我已经将该路由一直移动到顶部,但仍然找不到它...如果我将 [HttpGet] 添加到我的方法中,它会获取该方法,但它没有传递标识符...
    • @AdriaanDavel 很抱歉,我无法使用 RTM 版本的 Web API 重现您的问题,您能否在某处提供示例项目以便进一步分析问题?
    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多