2016-06-27 15 views
0

Ich habe gerade von einem sehr schlechten Web-API-Code in C# vererbt. Ich muss es verbessern, aber ich weiß nicht, wo ich anfangen soll. Es gibt viele Klassen und der Code ist ein Albtraum. Ich denke auch, dass ein Teil des Codes niemals benutzt wird.Wie kann ich die Leistung verfolgen und protokollieren und meine Web-API-Anfragen abrufen?

Ich möchte die Anzahl der Zeit zählen, die jede Anfrage aufgerufen wird und zu welcher Zeit jede Anfrage dauern. Ich möchte alle meine Ergebnisse in einer Tabelle protokollieren. In ein oder zwei Tagen konnte ich eine klare Vorstellung davon haben, was ich am meisten gebraucht habe und was Zeit braucht. Kunde beschweren sich darüber.

Ich benutze Log für Log und eine einfache Stoppuhr zur Berechnung der Leistung. Was schlagen Sie vor? Ich weiß, dass es besser ist, Filter und Attribute für Traces zu verwenden, aber wie kann ich diese Leistung protokollieren und verfolgen?

// GET api/Item/5 
public Item GetItem(string id) 
{ 
    // I don't use string.Format in my real code. This is just for this example. 
    logger.Trace(string.Format("Request: GET api/Item/{0}", id)); 
    Stopwatch sw = new Stopwatch(); 
    sw.Start(); 

    Item item = context.Items.Single(i => i.Code == id); 

    sw.Stop(); 
    logger.Trace(string.Format("Response: GET api/values/{0}\r\nElpased={1}\r\rn{2}", id, sw.Elapsed, response)); 

Ich fand Vorinformationen hier

Dank

http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi

Exact time measurement for performance testing

Natürlich sind alle diese Trace und Performance-Jobs werden von meiner Konfigurationsdatei aktiviert oder deaktiviert werden . Für NLog ist es eingebaut. Für die Stoppuhr plane ich etwas zu bauen. Ich habe nicht vor, dies ständig auf Produktion zu halten

+0

Resharper wird hier nicht helfen. Resharper kann eine nicht verwendete Anforderung zur Laufzeit nicht erkennen. –

+0

Attributbasisprotokollierung Überprüfen Sie dieses http://stackoverflow.com/questions/13655541/wcf-service-attribute-to-log-method-calls-and-exceptions – Prathyush

+0

Ok, Lesen Sie meine Frage Offir Pe'er. Es geht darum, Code zu schreiben, ohne ein Werkzeug zu verwenden. –

Antwort

1

Sie können DelegatingHandler verwenden.

Ein Basistyp für HTTP-Handler, die die Verarbeitung von HTTP-Antwortnachrichten an einen anderen Handler delegieren, den so genannten inneren Handler.

enter image description here

in Pipeline-Injektion ermöglicht Ort zu erfassen vor und nach der Anforderungsverarbeitung in dem Controller.

public class MonitoringDelegate : DelegatingHandler 
{ 
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
    var watcher = Stopwatch.StartNew(); 
    var response = await base.SendAsync(request, cancellationToken); 
    watcher.Stop(); 

    //log/store duration using watcher.ElapsedMilliseconds 

    return response; 
    } 
}