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