我需要能够在NancyFx中动态路由。想象一下博客,或使用 url-slugs 来识别特定博客/页面的动态CMS。我想,如果它是用NancyFx编写的,那么SO会做某种事情......
由于可能存在数千个不同的url-slugs(从数据库中提取页面内容),因此预先构建路由表不是最好的方法。
我尝试在NancyModule
的构造函数中执行以下操作:
public HomeModule()
{
...
foreach (var page in pages)
{
Get(page.Slug, args => GetPage(page.Slug));
}
}
这种作品,但有以下限制:
路由在Web应用程序启动时构建一次(NancyFx缓存它在开始时发现的所有路由)。任何可能在运行时稍后动态添加的新路线(页面或博客条目及其独特的slu)都无法识别。
所有路线都是预建的,即使只有少数路线可能会被访问。如果页面列表/唯一的slugs数以千计,这是非常浪费的。
任何人都可以建议在NancyFx中动态路由的策略,即 - 当动态添加具有唯一slug的页面时 - 如何使用不同的slug路由到默认的PageModule?此外,仍应遵守预定义模块及其路线。例如,我希望这些网址路由到HomeModule
:
/
/topic1
/topic2
/topic3
...
(以及任何数量的其他主题,除了下面特别列出的那些主题外),但是下面有自己的模块来处理它们,即如果有一个页面/博客文章定义了冲突的slug,它将无法访问:< / p>
/admin
/gallery
/image
注意:如果可能,我特别希望避免在URL中使用专门的模块段,如/page/{page-slug}
中所示。如果page-slug
未在另一个模块中预定义,我希望全能HomeModule
来处理它。
答案 0 :(得分:1)
路线在Nancy中加权,这意味着某些非常具体的东西将被选择不太具体的东西。
如果您定义:
Get("/admin", ...);
Get("/gallery", ...);
Get("/image", ...);
Get("/{topic}", ...);
http://test.com/admin的来电将通过更具体的路线/admin
获取,而不是特定路线所有路线/{topic}
除非您的列表是预先定义的,否则您无法动态添加路由,因为这些是在首次加载时进行解析并缓存的,因此只有在第一个请求通过时才进行查找。
您不想添加100个特定路由,这会增加查找时间并阻碍性能(如果您关心毫秒)
路线权重在此处定义:
https://github.com/NancyFx/Nancy/wiki/Defining-routes#pattern
如您所见,特定路线的加权为10,000,而捕获全部的加权为1000.