2013-03-25 8 views
6

Ich implementiere eine API über einen Webservice mit Nancy.Gibt es eine Möglichkeit, alle verfügbaren Routen in einer Nancy-Anwendung aufzulisten?

Ich hätte gerne eine/help- oder/docs-Seite, die programmatisch alle verfügbaren Routen auflistet, so dass ich API-Benutzern automatisch generierte/aktualisierte Dokumentation bereitstellen kann.

Irgendwelche Ideen, wie dies zu erreichen ist? (Innerhalb eines Routen-Handlers bietet "this.routes" Zugriff auf eine Sammlung von definierten Routen - aber nur auf dem aktuellen NancyModule. Ich würde einen programmatischen Weg brauchen, um alle registrierten Routen aufzulisten, nicht nur die im aktuellen Modul)

+3

antwortete ich dies auf die Frage, die Sie auf unserer Benutzergruppe – TheCodeJunkie

Antwort

8

Sie können es tun, indem eine Abhängigkeit von der IRouteCacheProvider nehmen und GetCache fordern - wir tun dies tatsächlich in einem unserer Demos im Haupt Repo:

https://github.com/NancyFx/Nancy/blob/master/src/Nancy.Demo.Hosting.Aspnet/MainModule.cs#L13

+2

Link-posted gebrochen ab Juni 2016. Dies ist der neue Standort ist, wenn mich nicht alles täuscht: https: // GitHub. com/NancyFx/Nancy/Blob/Master/Beispiele/Nancy.Demo.Hosting.Aspnet/MainModule.cs –

10

nicht genau, was Sie brauchen, aber es gibt auch ein eingebautes Armaturenbrett in Nancy. Um sie zu aktivieren tun:

public class CustomBootstrapper : DefaultNancyBootstrapper 
{ 
    protected override DiagnosticsConfiguration DiagnosticsConfiguration 
    { 
     get { return new DiagnosticsConfiguration { Password = @"secret"}; } 
    } 
} 

Und dann können Sie darauf zugreifen auf {yournancyapp}/_ nancy

https://github.com/NancyFx/Nancy/wiki/Diagnostics

0

Beispiel dafür, wie IRouteCacheProvider wie @grumpydev in this answer erwähnt zu verwenden:

// within your module 
public class IndexModule : NancyModule 
{ 
    // add dependency to IRouteCacheProvider 
    public IndexModule(Nancy.Routing.IRouteCacheProvider rc) 
    { 
     routeCache = rc; 
     Get["/"] = GetIndex; 
    } 

    private Nancy.Routing.IRouteCacheProvider routeCache; 

    private dynamic GetIndex(dynamic arg) 
    { 
     var response = new IndexModel(); 

     // get the cached routes 
     var cache = routeCache.GetCache(); 

     response.Routes = cache.Values.SelectMany(t => t.Select(t1 => t1.Item2)); 

     return response; 
    } 
} 

public class IndexModel 
{ 
    public IEnumerable<Nancy.Routing.RouteDescription> Routes { get; set; } 
} 

Sie können die Routing-Informationen wie Path und Method von der l erhalten ist von Nancy.Routing.RouteDescription. Zum Beispiel mit dieser Ansicht:

<!DOCTYPE html> 
<html> 
<body> 
<p>Available routes:</p> 
<table> 
<thead><tr><th>URL</th><th>Method</th></tr></thead> 
<tbody> 
@Each.Routes 
<tr><td>@Current.Path</td><td>@Current.Method</td></tr> 
@EndEach 
</tbody> 
</table> 
</body> 
</html> 
Verwandte Themen