5

Ich entwickle eine Website auf Azure, mit MVC5. Ich verwende Attribut-Routing mit Routen und Routen-Präfix auf Controllern. Ich rufe mit action.link helper an. Ich habe meine Routen nicht benannt.Schlechte Leistung und langsame Website mit MVC 5 Attribut-Routing

Ich habe folgendes auf meinem route.config:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.MapMvcAttributeRoutes(); 
routes.LowercaseUrls = true; 
routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

Meine Controller sind wie:

[OutputCache(Duration = 600, Location = System.Web.UI.OutputCacheLocation.Client)] 
[RoutePrefix("istanbul/kadikoy")] 
[Route("{action=index}")] 
public class KadikoyController : Controller 
{ 

    public ActionResult Index() 
    { 
     return View(); 
    } 

    [Route("kadikoy-tarihi")] 
    public ActionResult KadikoyTarihi() 

Ich habe sehr, sehr schlechte Leistung als Server-Antwortzeit, dh 9.6s

Wenn ich die Attribut-Route-Codes auskommentiere, habe ich beim Standard-Routing eine Server-Antwortzeit von 2,1 Sekunden.

Vielen Dank für Ihre Antworten.

+2

Tritt die schlechte Leistung nur während der ersten Anforderung an IIS auf? Dies kann dadurch verursacht werden, dass IIS den ursprünglichen Arbeitsprozess erstellt. – alex

+0

Ich sehe das gleiche, speziell, dass Call die zugeordneten Routen zuordnen. Ich nehme an, dass es daran liegt, dass mehr Assemblies gescannt werden als nötig, um alle Attribute zu finden, oder dass die Reflektion langsamer als die routinemäßigen Programmdefinitionen ist. –

Antwort

0

Es stellt sich heraus, dass das wirklich teure Bit dieser Operation nicht die zugewiesenen Routen abbildet, sondern dass MVC vorher die ControllerFactory erstellen und alle Controller-Typen abrufen muss. Dieser Prozess entspricht 1245 ms in meinem Projekt, während der Rest der MapMvcAttributeRoutes() - Funktionen etwa 45 ms benötigt. Meine Vermutung ist, dass, wenn Sie das Attribut Routing nicht verwenden, die Controller nach Bedarf und nicht auf einmal gefunden werden.