2015-03-30 1 views
11

Ich habe ein .NET-Projekt in C# mit WebApi 2.2 ausgeführt.erhalten Sie eine Liste der Attribute Route Vorlagen asp.net webapi 2.2

Ich registriere alle meine Routen mit Attributen. Was ich tun möchte ist, alle Attribut-Route-Vorlagen als Strings pro grammatisch abzurufen.

Etwas wie: var routeTemplates = System.Web.Routing.RouteTable.Routes.Select(x => x.RouteTemplates);

Ich bin in der Lage all die Routen zu sehen, wenn ich eine Uhr setzen auf ControllerContext.Configuration.Routes

Allerdings kann ich nicht scheinen, um die Routen aus meinem Code zugänglich, da sie Einbauten geschützt sind . Wie komme ich an sie?

Ich habe einen Screenshot angehängt, der die Werte zeigt, die ich auf meiner locals watch sehe, die ich bekommen muss.

The data I want to get at

+0

Anscheinend Stackoverflow lässt Sie die Bilder in voller Größe nicht anzeigen. So ist es hier hochgeladen: http://imgur.com/DFlMqDa –

Antwort

10

Bei der Registrierung der Attribut Routen in Web-API Sie IDirectRouteProvider eine benutzerdefinierte registrieren können anpassen, wie das Attribut Routen zu finden sind. In dieser benutzerdefinierten IDirectRouteProvider können Sie alle "harte" Arbeit an die Standardimplementierung, DefaultDirectRouteProvider, delegieren, die alle Controller und Aktionen zur Berechnung der Liste der Attributrouten betrachtet, und dann Anerkennung für all diese harte Arbeit.

Um dies alles auf, zunächst einen neuen „beobachtbaren“ direkter Weg Anbieter schaffen gesetzt, die Delegierten alle seine Arbeit:

public class ObservableDirectRouteProvider : IDirectRouteProvider 
{ 
    public IReadOnlyList<RouteEntry> DirectRoutes { get; private set; } 

    public IReadOnlyList<RouteEntry> GetDirectRoutes(HttpControllerDescriptor controllerDescriptor, IReadOnlyList<HttpActionDescriptor> actionDescriptors, IInlineConstraintResolver constraintResolver) 
    { 
     var realDirectRouteProvider = new DefaultDirectRouteProvider(); 
     var directRoutes = realDirectRouteProvider.GetDirectRoutes(controllerDescriptor, actionDescriptors, constraintResolver); 
     // Store the routes in a property so that they can be retrieved later 
     DirectRoutes = DirectRoutes?.Union(directRoutes).ToList() ?? directRoutes; 
     return directRoutes; 
    } 
} 

und dann von der WebApiConfig.Register Methode in Ihrem App Inbetriebnahme diese neue Klasse verwenden:

public static class WebApiConfig 
{ 
    public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider(); 

    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

Beachten Sie, dass die Daten letztlich in einem statischen Feld gespeichert werden. Dies ist erforderlich, da der Code innerhalb von WebApiConfig.Register nicht sofort aufgerufen wird - er wird später in global.asax.cs aufgerufen. So die Ergebnisse alles zu beobachten, fügen Sie einige Code Application_Start:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 

    var allDirectRoutes = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes; 
    // now do something with 'allDirectRoutes' 
} 

Und in einem kleinen Test, den ich geschrieben habe, habe ich diese Werte:

enter image description here

Und dort haben Sie es, eine Liste aller Attribut-Routen in der App!

Hinweis: In der Eigenschaft.jeder Route werden zusätzliche Daten gespeichert, wenn Sie herausfinden möchten, woher die einzelnen Attributrouten stammen.

+0

Vielen Dank! Ich werde damit spielen, scheint aber der richtige Weg zu sein. –

+0

Ich muss 23 Stunden warten, um das Kopfgeld zu vergeben. –

+0

Auch gefunden diese https://github.com/Daniel15/RouteJs/blob/master/src/RouteJs/RouteCollectionUtils.cs –

Verwandte Themen