12

He encontrado una pequeña diferencia en las clases base de enrutamiento en ASP.NET Web Api que me ha obligado a escribir una pequeña clase de ayuda que me permitirá definir mis rutas sólo una vez. ¿Hay alguna razón para esto? Estoy asumiendo que era demasiado grande un cambio en el marco de hacer ambas RouteCollection s derivan de la misma clase base o implementar la misma interfaz (lo que habría hecho esta clase mucho más simple)Enrutamiento Api Web ASP.NET (IIS vs Self Hosted)

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

Lo que esto me permite hacer es llamar a un método simple AddHttpRoutes tanto en mi Global.asax como en mis pruebas de integración.

Integración Pruebas de

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

Es este un problema conocido y que es probable que se fije en una versión posterior de Api Web ASP.NET?

+0

Gran código de ejemplo, lo modifiqué ligeramente para mantener todo el código de enrutamiento dentro del archivo RouteConfig.cs original. – angularsen

Respuesta

4

Sí, el enrutamiento es ligeramente diferente debido al hecho de que ASP.NET ya tiene enrutamiento, pero no pudimos depender de él directamente, ya que eso evitaría la compatibilidad con el autoaceptador. Todavía estamos viendo cómo las cosas podrían tener más sentido.

+0

Creo que si se cambiaran ambos para implementar una interfaz común, se podría usar un método de extensión y el enrutamiento solo tendría que hacerse en un solo lugar. Similar a lo que hice, pero solo con el método de extensión necesario. Estoy seguro de que se te ocurrirá algo mucho más inteligente que eso :) –