Ich habe ein Leistungsproblem mit einer relativ einfachen ASP.MVC-Ansicht.Der erste Aufruf von Url.Action auf einer Seite ist langsam
Es ist eine Anmeldeseite, die fast augenblicklich sein sollte, dauert aber etwa eine halbe Sekunde.
Nach viel graben sieht es aus wie das Problem ist der erste Anruf der Url.Action
- es dauert rund 450ms (nach MiniProfiler), aber das scheint wahnsinnig langsam.
Nachfolgende Aufrufe an Url.Action
nehmen < 1ms, was mehr im Einklang mit dem ist, was ich erwarten würde.
Dies ist konsistent, ob ich Url.Action("action", "controller")
oder Url.Action("action")
verwende, scheint aber nicht zu passieren, wenn ich Url.Content("~/controller/action")
verwende. Dies passiert auch, wenn ich Html.BeginForm("action")
rufe.
Hat jemand eine Idee, was das verursacht?
Ein dig in die source legt nahe, dass RouteCollection.GetVirtualPath
könnte die Ursache sein, als dass sowohl auf Url.Action
und Html.BeginForm
üblich ist. Aber sicher, dass das überall benutzt wird? Ich meine, eine halbe Sekunde ist viel zu langsam.
Ich habe 20 oder so benutzerdefinierte Routen (es ist eine ziemlich große App mit einigen alten WebForms Seiten), aber selbst dann scheinen die Zeiten viel zu langsam.
Irgendwelche Ideen, wie man es repariert?
Das kompiliert Ansichten nicht vor, die sie nur nach einem Build kompilieren, so dass Sie Buildfehler statt Laufzeitfehler erhalten. Es machte auch keinen Unterschied - ich sehe immer noch 450ms beim ersten "Url.Action" -Ruf. – Keith
Korrekte Vorkompilierung ist möglich mit ASPNet_Compiler.exe (siehe http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx) aber auch ohne die Zeit sehe ich für ' Url.Action' ist verrückt - es ist fast so, als würde man die volle Reflektion machen, um die Controller-Aktionen jedes Mal zu finden, wenn die Seite läuft. – Keith
Können Sie Ihre RegisterRoutes (von global.asax) anzeigen? Es kann sich auf Ihre Zeit auswirken. –