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:
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.
Anscheinend Stackoverflow lässt Sie die Bilder in voller Größe nicht anzeigen. So ist es hier hochgeladen: http://imgur.com/DFlMqDa –