Asp.NET MVC路由性能

3

我有一个应用程序,里面包含数千个路由。

这是因为我们针对每个产品使用自定义URL,而不是传统的/product/id格式。

由于这么多的URL,路由器的性能变得难以接受。

我正在尝试找到改进性能的方法,但我一直想不出来。

我大约有20个正则表达式路由和大约3000个独特的URL路由。

有什么好的建议吗?

很抱歉我的问题比较开放,但我不确定从哪里开始。


你能解释一下性能瓶颈的具体来源是什么吗?如果不能,那就说明你还没有做足够的分析。 - mellamokb
1
我使用了Haack的路由调试器并设置了时间戳来测量性能。我移动了我的路由(顺序)并且有所改善,但是最后添加的路由非常慢。 - hivie7510
我遇到的另一个问题是我不知道如何对路由器本身进行分析。 - hivie7510
我假设您已经删除了未使用的视图引擎? - David Wick
我们只使用 Razor 引擎,但我该如何删除其他引擎?这样做是否可以提高路由器性能? - hivie7510
Application_Start 中:ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine()); 这将使其仅查找 .cshtml 文件。 - David Wick
2个回答

3
如果您的url都是形如yoursite.com/{url},您仍然可以将所有三千个url存储在数据库中,并创建一个自定义控制器工厂,使用{url}参数在数据库中查找正确的信息并分配正确的控制器、操作和任何您正在使用的参数。
有很多google上的帖子介绍如何实现控制器工厂。
我想您也希望对现有路由进行一些解析,以将它们全部放入数据库中 - 这可能可以通过在实例化应用程序后(即在调用RegisterRoutes()之后)迭代RouteTable来完成。

这与我们以前所拥有的类似,让我检查一下。我的意思是,如果我点击默认控制器,那么我可以检查该URL是否在哈希表中,并路由到适当的控制器。 - hivie7510

0

我会摆脱三千个唯一的URL路由,并用一个通用路由替换它们,这个通用路由是最后一个捕获所有路由。类似于:

routes.MapRoute("productRoute", "{category}/{manufacturer}/{productTitle}", new { controller = "Products", action = "Index", category = UrlParameter.Optional, manufacturer = UrlParameter.Optional, productTitle = UrlParameter.Optional });

你还可以添加自定义的IRouteConstraint来验证该类别是否存在(但请确保它不会每次都访问数据库,否则性能会下降)。

我曾经提到过我没有学术背景:“这是因为我们针对每个产品使用自定义URL,而不是教科书上的/product/id”。 - hivie7510
是的,为了SEO,我们为我们提供的每个产品输入自定义URL。例如,我们有类似/air-filter/some-manfacturer-url的东西。我们还可能有/brake/some-braker-maker。 - hivie7510
@hivie7510 为什么不把这个 slug(url)存储在产品表中呢?如果你这样做了,那么你就不需要那么多的路由,仍然可以获得良好的可读性 url,这就是几个博客的工作方式。 - Joakim
@hivie7510,我见过的一种常用的路由是“Archive/{year}/{month}/{day}/{slug}”,这样博客通常可以避免一个帖子具有相同的 slug。只要您有一种使其真正独特的方法,则应该能够创建这种通用路由。(换句话说,slug 将用作 ID) - Joakim
@hivie7510 不,博客没有这个问题。它们使用slug作为键,而不是路由。 - Andrew Barber
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接