C# NancyFx中的动态路由

C# NancyFx中的动态路由,c#,routing,nancy,C#,Routing,Nancy,我需要能够在NancyFx中动态路由。想想一个博客,或者一个动态CMS,它使用url段塞来识别特定的博客/页面。我想,如果它是用NancyFx写的,那么我们也会做类似的事情 由于可能有数千个不同的url段塞(从数据库提取的页面内容),因此预先构建路由表不是最好的方法 在我的NancyModule的构造函数中,我尝试了以下操作: public HomeModule() { ... foreach (var page in pages) { Get(page.Slug

我需要能够在NancyFx中动态路由。想想一个博客,或者一个动态CMS,它使用url段塞来识别特定的博客/页面。我想,如果它是用NancyFx写的,那么我们也会做类似的事情

由于可能有数千个不同的url段塞(从数据库提取的页面内容),因此预先构建路由表不是最好的方法

在我的
NancyModule
的构造函数中,我尝试了以下操作:

public HomeModule()
{
   ...
   foreach (var page in pages)
   {
       Get(page.Slug, args => GetPage(page.Slug));
   }
}
这类方法可行,但有以下限制:

  • 路由在web应用程序开始时构建一次(NancyFx缓存它在开始时发现的所有路由)。任何新的路由(页面或博客条目及其唯一的slug)都不会被识别,这些路由可能会在以后的运行时动态添加

  • 所有路线都是预先建造的,即使只有少数路线可能会被参观。如果页面/唯一slug的列表有数千个,那么这是非常浪费的

  • 在NancyFx中,有人能提出一种动态路由策略吗?也就是说,在动态添加具有唯一段塞的页面时,如何路由到具有不同段塞的默认PageModule?此外,预定义模块及其路由仍应受到尊重。例如,我希望这些URL路由到
    HomeModule

    /
    /topic1
    /topic2
    /topic3
    ... 
    
    (以及任何数量的其他主题,除了下面特别列出的主题),但以下主题有自己的模块来处理它们,即,如果存在使用冲突slug定义的页面/博客文章,则无法访问:

    /admin
    /gallery
    /image
    

    注意:如果可能,我特别希望避免在URL中使用专门的模块段,如
    /page/{page slug}
    。如果
    page slug
    未在另一个模块中预定义,我希望catch all
    HomeModule
    来处理它。

    路由在Nancy中加权,这意味着将从不太具体的路由中选择非常具体的路由

    如果您定义了:

    Get("/admin", ...);
    Get("/gallery", ...);
    Get("/image", ...);
    Get("/{topic}", ...);
    
    对的调用将由更具体的路由进行拾取,该路由为
    /admin
    ,而不是不太具体的catch-all路由
    /{topic}

    此外,除非预先定义了一次列表,否则无法动态添加路由,因为这些路由在第一次加载时被解析并缓存,因此只有在第一次请求通过时才进行查找

    您不想添加100个特定路由,这将增加查找时间并阻碍性能(如果您关心毫秒)

    此处定义了路线权重:


    如您所见,一条特定路线的权重为10000,而一条综合路线的权重为1000