2013-04-16 14 views
7

Ich habe kürzlich unsere bestehende ASP.NET MVC 2-Anwendung mit einem WebAPI-Backend auf MVC 4 umgestellt. Leider habe ich einige schwerwiegende Leistungsprobleme in Bezug auf WebAPI bemerkt.Schlechte WebAPI-Leistung

Ich habe MiniProfiler Setup und fügte einige Schritte hinzu, um zu sehen, ob ich den Engpass identifizieren konnte, und zu meiner Überraschung ist es nicht die Datenbank. Vor der Umwandlung würde eine Anforderung wie diese nicht mehr als ~ 50 ms dauern, also ist es etwas schockierend, diese einfachen Anforderungen für mehr als 2 Sekunden zu betrachten.

enter image description here

Der ungerade Teil ist, dass all dies ist, dass die Mehrheit der Latenz auftritt, bevor die Anforderung selbst macht es auf die SQL selbst nennt.

Ich fragte mich, ob es eine bekannte Möglichkeit gäbe, MiniProfiler tiefer in WebAPIs Aufrufe einzubinden, um genauer zu untersuchen, was hier eigentlich vor sich geht. Jede Hilfe würde sehr geschätzt werden.

FWIW, hier ist der Code für diese Anforderung

WebAPI-Controller verwendet:

[HttpGet] 
public bool AssetExistsById(string assetId) { 
    using (Current.Profiler.Step("WebAPI Call To Model")) { 
     return Asset.AssetExists(assetId); 
    } 
} 

Asset-Modell:

public static bool AssetExists(string assetId) { 
    using (Current.Profiler.Step("WCF call to DataAccess lib")) { 
     return WcfEndPoint.AssetExists(assetId); 
    } 
} 

Dank!

aktualisieren

Also, was ich herausgefunden habe hier los war ... Es stellt sich heraus, dass ich System-Diagnose Tracing in meiner App_Start/WebApiConfig.cs Datei aktiviert hatte. Ich habe die folgende Zeile zufällig auskommentiert und alles war behoben.

config.EnableSystemDiagnosticsTracing(); 

Ich hoffe, das hilft anderen!

+2

Haben Sie versucht, ein VS-Profil zu nehmen, um herauszufinden, was so viel Zeit kostet? –

+0

Haben Sie statische Seiten/Bilder in der Webanwendung, um die Ladezeiten zu testen? Es kann sich um Netzwerk/Server handeln. –

+0

@YoussefMoussaoui Danke für die Antwort! Ich habe tatsächlich den Profiler hochgespielt, aber nichts besonders interessantes gefunden, warum meine Anfragen so lange gedauert haben ... Der längste Teil war das Routing der Anfrage, aber selbst das war relativ kurz. Vielleicht benutze ich den falschen Profiler? Ich benutze VS2012, wenn das hilft. –

Antwort

7

So habe ich herausgefunden, was hier vorging ... Es stellte sich heraus, dass ich in meiner Datei App_Start/WebApiConfig.cs System-Diagnose-Tracing aktiviert hatte. Ich habe die folgende Zeile zufällig auskommentiert und alles war behoben.

config.EnableSystemDiagnosticsTracing(); 

Ich hoffe, das hilft anderen!

+0

Ich wünschte, ich hätte das vor 4 Stunden gesehen! Ich hatte genau dieses Problem und fand die Lösung genau so. :) Interessanterweise haben wir die Leistung nur bei der Bereitstellung in Azure erreicht. Wenn Sie lokal arbeiten, schien die Anwendung in Ordnung zu sein. –

+0

Ja, ich hatte vor ein paar Wochen wieder mit verschiedenen diagnostischen Läufern herumgespielt und dieses Mal keine Latenzprobleme bemerkt. Interessant, dass Sie nur Probleme nach der Bereitstellung in Azure gesehen haben! Möglicherweise ein Problem beim Verwenden der Diagnoseprotokollierung beim Ausführen von Release vs Debug? –

+0

Die von mir erwähnte Azure-Instanz ist ein Ziel für die kontinuierliche Bereitstellung und Integrationstests. Es führt eine Debug-Version des Builds aus. –