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));
   }
}

这类作品,但有以下限制:

  1. 路由在 Web 应用程序启动时构建一次(NancyFx 缓存它在开始时发现的所有路由)。无法识别稍后可能在运行时动态添加的任何新路由(页面或博客条目及其独特的 slugs)。

  2. 所有路线都是预先构建的,尽管只有少数路线可能会被访问​​。如果 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。