2012-02-23 164 views
12

我發現ASP.NET Web Api中的路由基類有一點點區別,它迫使我編寫一個輔助類來允許我定義路由就一次。是否有一個原因?我假設它是太大的變化框架,以使雙方RouteCollection■從同一個基類派生或實現相同的接口(將做這類簡單得多)ASP.NET Web Api路由(IIS vs自託管)

public static class RouteMapper 
{ 
    private class Route 
    { 
     public string Name { get; set; } 
     public string Template { get; set; } 
     public object Defaults { get; set; } 

     public Route(string name, string template, object defaults) 
     { 
      Name = name; 
      Template = template; 
      Defaults = defaults; 
     } 
    } 

    private static List<Route> GetRoutes() 
    { 
     return new List<Route> 
        { 
         new Route(
          "API Default", 
          "api/{controller}/{id}", 
          new {id = RouteParameter.Optional}) 
        }; 
    } 

    public static void AddHttpRoutes(this HttpRouteCollection routeCollection) 
    { 
     var routes = GetRoutes(); 
     routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults)); 
    } 

    public static void AddHttpRoutes(this RouteCollection routeCollection) 
    { 
     var routes = GetRoutes(); 
     routes.ForEach(route => routeCollection.MapHttpRoute(route.Name, route.Template, route.Defaults));    
    } 
} 

這是什麼讓我要做的就是在我的Global.asax和我的集成測試中調用簡單的AddHttpRoutes方法。

集成測試

 var configuration = new HttpSelfHostConfiguration("http://localhost:20000"); 
     configuration.Routes.AddHttpRoutes(); 

     _server = new HttpSelfHostServer(configuration); 
     _server.OpenAsync().Wait(); 

的Global.asax

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.AddHttpRoutes(); 

     routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 

這是一個已知問題,是可能被固定在ASP.NET的Web API的一個以後的版本?

+0

偉大的示例代碼,我稍微修改它以保留原始RouteConfig.cs文件中的所有路由代碼。 – angularsen 2012-12-21 11:31:47

回答

4

是的,路由稍有不同,因爲ASP.NET已經有了路由,但是我們不能直接依賴它,因爲這會阻止自主主機的支持。我們仍在研究事情如何更有意義。

+0

我想如果他們都改爲實現一個通用接口,那麼可以使用擴展方法,而路由只需要在一個地方完成。類似於我所做的,但只需要一種擴展方法。我相信你會想出比這更聰明的東西:) – 2012-02-23 21:10:05