Catch-all路由无法使用WebApi2 ApiController查找路由

时间:2014-01-10 12:43:04

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

我正在创建一个WebApi2服务,我想要实现的其中一个方法表示来自内部树结构中的对象的HTTP GET - 因此请求将按以下方式进行:

GET /values/path/path/to/object/in/tree

所以我希望我的方法接收“path / to / object / in / tree”。

然而,当我运行这个时,我只得到404,而且有趣的是我得到的404与标准的IIS 404不同。它的标题是'/'应用程序中的服务器错误',而一个完全无效的资源标题为'HTTP Error 404.0 - Not Found'。

我正在使用默认模板来尝试查看是否可以使其工作,因此具有相似性。

我的RouteConfig

public static void RegisterRoutes(RouteCollection routes)
{
    var route = routes.MapRoute(
               name: "CatchAllRoute",
                url: "values/path/{*pathValue}",
                defaults: new { controller = "Values", action = "GetPath" });
}

这是我的ValuesController

[System.Web.Mvc.AuthorizeAttribute]
[RoutePrefix("values")]
public class ValuesController : ApiController
{
    [Route("test/{value}")]
    [HttpGet]
    public string Test(string value)
    {
        return value;
    }

    [HttpGet]
    public string GetPath(string pathValue)
    {
        return pathValue;
    }
}

有趣的是,如果我从Controller而不是ApiController派生它可以正常工作,但普通的属性路由不起作用。

我尝试按照this post (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding)中的方法进行操作,但我无法让它发挥作用。

我确定我错过了一些愚蠢容易的事情,但是花了几个小时的时间,我觉得谨慎地问我做错了什么。

由于

中号

1 个答案:

答案 0 :(得分:5)

Web api路由与路由MVC不同。而不是

route.MapRoute

public static void Register(HttpConfiguration config) {
    config.MapHttpAttributeRoutes

    config.Routes.MapHttpRoute(
        name: "CatchAll", routeTemplate: "values/path/{*pathvalue}", 
        defaults: new {id = RouteParameter.Optional });
}

它从控制器起作用的原因是MapRoute是路由MVC控制器的正确格式,而MapHttpRoute是为API控制器设计的。