2014-01-10 55 views
2

我正在創建一個WebApi2服務,並且我想要實現的方法之一代表來自內部樹結構內的對象的HTTP GET - 因此請求將沿着行:Catch-all路由無法找到WebApi2的路由ApiController

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

所以我想我的方法來接收「路徑/到/對象/在/樹」。

但是,當我運行這個程序時,我剛剛得到了一個404,而且有趣的是,我得到了一個與標準IIS 404不同的404.它的標題爲'服務器錯誤'/'應用程序',而一個對於完全無效的資源標題爲「HTTP錯誤404.0 - 未找到」。

我在玩默認模板來試試看看我能否得到這個工作,因此相似性。

我必須爲我的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)中的方法,但我無法讓它工作。

我確定我錯過了一些愚蠢的事情,但花了幾個小時,我認爲謹慎的問我做錯了什麼。

感謝

中號

+0

你記得做'config.MapHttpAttributeRoutes();'註冊屬性路由嗎? – crunchy

回答

5

網絡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 }); 
} 

從控制器工作的原因是,圖路線是路由的MVC控制器正確的格式,而MapHttpRoute是專爲API控制器。

+3

我覺得發誓。謝謝。 –