gpt4 book ai didi

asp.net-mvc - 页面上首次调用 Url.Action 速度很慢

转载 作者:行者123 更新时间:2023-12-03 01:48:21 25 4
gpt4 key购买 nike

我在使用相当简单的 ASP.MVC View 时遇到性能问题。

这是一个登录页面,应该几乎是即时的,但大约需要半秒。

经过大量挖掘后,问题似乎出在第一次调用 Url.Action - 它花费了大约 450 毫秒(根据 MiniProfiler ),但这似乎非常慢。

Url.Action 的后续调用需要 <1 毫秒,这更符合我的预期。

无论我使用 Url.Action("action", "controller") 还是 Url.Action("action"),这都是一致的,但似乎不一致如果我使用Url.Content("~/controller/action"),就会发生这种情况。当我调用 Html.BeginForm("action") 时也会发生这种情况。

有人知道这是什么原因吗?

深入了解source表明 RouteCollection.GetVirtualPath 可能是罪魁祸首,因为这对于 Url.ActionHtml.BeginForm 都很常见。但是,这肯定到处都在使用吗?我的意思是,1/2 秒太慢了。

我有 20 条左右的自定义路由(这是一个相当大的应用程序,带有一些遗留的 WebForms 页面),但即便如此,时间似乎也太慢了。

有什么解决办法吗?

最佳答案

发现问题,问题出在路由表上(基里尔欢呼)。

基本上我们有很多类似这样的路线:

string[] controllers = GetListOfValidControllers();

routes.MapRoute(
name: GetRouteName(),
url: subfolder + "/{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional },
constraints: new { controller = "(" + string.Join("|", controllers) + ")" });

事实证明the Regex check is very slow ,慢得令人痛苦。因此,我将其替换为仅检查 HashSetIRouteConstraint 实现。

然后我改变了 map 路线调用:

routes.MapRoute(
name: GetRouteName(),
url: subfolder + "/{controller}/{action}/{id}",
defaults: new { action = "Index", id = UrlParameter.Optional },
constraints: new { controller = new HashSetConstraint(controllers) });

我还使用了RegexConstraint mentioned in that linked article对于任何更复杂的事情 - 包括大量这样的调用(因为我们有遗留的 WebForm 页面):

routes.IgnoreRoute(
url: "{*allaspx}",
constraints: new { allaspx = new RegexConstraint( @".*\.as[pmh]x(/.*)?") });

这两个简单的改变就完全解决了问题; Url.ActionHtml.BeginForm 现在花费的时间可以忽略不计(即使有很多路由)。

关于asp.net-mvc - 页面上首次调用 Url.Action 速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com