我正在使用 Nancy 通过 Web 服务实现 API。
我想要一个 /help 或 /docs 页面以编程方式列出所有可用路由,以便我可以为 API 用户提供自动生成/更新的文档。
关于如何做到这一点的任何想法?(在路由处理程序中,“this.routes”可以访问已定义路由的集合 - 但仅限于当前的 NancyModule。我需要一种编程方式来列出所有已注册的路由,而不仅仅是当前模块中的路由)
我正在使用 Nancy 通过 Web 服务实现 API。
我想要一个 /help 或 /docs 页面以编程方式列出所有可用路由,以便我可以为 API 用户提供自动生成/更新的文档。
关于如何做到这一点的任何想法?(在路由处理程序中,“this.routes”可以访问已定义路由的集合 - 但仅限于当前的 NancyModule。我需要一种编程方式来列出所有已注册的路由,而不仅仅是当前模块中的路由)
不完全是您所需要的,但 Nancy 中还有一个内置的仪表板面板。要启用它,请执行以下操作:
public class CustomBootstrapper : DefaultNancyBootstrapper
{
protected override DiagnosticsConfiguration DiagnosticsConfiguration
{
get { return new DiagnosticsConfiguration { Password = @"secret"}; }
}
}
然后您可以在 {yournancyapp}/_nancy 上访问它
您可以通过依赖 IRouteCacheProvider 并调用 GetCache 来做到这一点——我们实际上是在主仓库中的一个演示中做到这一点的:
https://github.com/NancyFx/Nancy/blob/master/src/Nancy.Demo.Hosting.Aspnet/MainModule.cs#L13
如何使用此答案IRouteCacheProvider
中提到的@grumpydev的示例:
// 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; }
}
您可以Path
从Method
. Nancy.Routing.RouteDescription
例如,使用此视图:
<!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>