Ich verwende Microsoft Asp.net WebApi2, das auf IIS gehostet wird. Ich möchte ganz einfach den Anfragetext (XML oder JSON) und den Antworttext für jeden Beitrag protokollieren.
Es gibt nichts Besonderes an diesem Projekt oder dem Controller, der den Beitrag bearbeitet. Ich bin nicht daran interessiert, Protokollierungsframeworks wie nLog, elmah, log4net oder die integrierten Ablaufverfolgungsfunktionen der Web-API zu verwenden, es sei denn, dies ist erforderlich.
Ich möchte einfach nur wissen, wo ich meinen Protokollierungscode ablegen soll und wie ich den tatsächlichen JSON oder XML aus der eingehenden und ausgehenden Anforderung und Antwort erhalten kann.
Meine Controller-Post-Methode:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
user2315985
quelle
quelle
Antworten:
Ich würde empfehlen, eine
DelegatingHandler
. Dann müssen Sie sich keine Gedanken mehr über Protokollierungscode in Ihren Controllern machen.Ersetzen
Trace.WriteLine
Sie einfach Ihren Protokollierungscode und registrieren Sie den HandlerWebApiConfig
wie folgt:Hier finden Sie die vollständige Microsoft-Dokumentation für Message Handler .
quelle
task.Result.Content
kehrt zurückSystem.Net.Http.ObjectContent
. Gibt es eine Möglichkeit, stattdessen das rohe xml / json zu erhalten?ContinueWith
undResult
sind gefährliche APIs. Es wäre weitaus besser,await
stattdessen zu verwenden , dhvar result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;
await request.Content.ReadAsStringAsync();
nicht zu einem Fehler, der besagt, dass der Anforderungsdatenstrom unter bestimmten Umständen bereits gelesen wurde?Es gibt mehrere Ansätze, um die Anforderungs- / Antwortprotokollierung für jeden WebAPI-Methodenaufruf generisch zu verarbeiten:
ActionFilterAttribute
: Man kann benutzerdefiniert schreibenActionFilterAttribute
und die Controller- / Aktionsmethoden dekorieren, um die Protokollierung zu aktivieren.Con: Sie müssen jeden Controller / jede Methode dekorieren (Sie können dies immer noch auf dem Basis-Controller tun, aber es werden immer noch keine Querschnittsthemen angesprochen.
Überschreiben
BaseController
und behandeln Sie die Protokollierung dort.Con: Wir erwarten / zwingen die Controller, von einem benutzerdefinierten Basis-Controller zu erben.
Verwenden von
DelegatingHandler
.Vorteil: Wir berühren hier nicht die Steuerung / Methode mit diesem Ansatz. Der delegierende Handler befindet sich isoliert und verwaltet die Anforderungs- / Antwortprotokollierung ordnungsgemäß.
Weitere Informationen finden Sie unter http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi .
quelle
Eine der Optionen, die Sie haben, besteht darin, einen Aktionsfilter zu erstellen und Ihren WebApiController / ApiMethod damit zu dekorieren.
Filterattribut
WebApi-Controller
oder
Hoffe das hilft.
quelle
Der Zugriff auf die Anforderungsnachricht ist einfach. Ihre Basisklasse
ApiController
enthält eine.Request
Eigenschaft , die, wie der Name schon sagt, die Anforderung in analysierter Form enthält. Sie überprüfen es einfach auf das, was Sie protokollieren möchten, und geben es an Ihre Protokollierungsfunktion weiter, je nachdem, um was es sich handelt. Diesen Code können Sie zu Beginn Ihrer Aktion einfügen, wenn Sie ihn nur für eine oder eine Handvoll ausführen müssen.Wenn Sie dies für alle Aktionen tun müssen (alles bedeutet mehr als eine überschaubare Handvoll), können Sie die
.ExecuteAsync
Methode überschreiben , um jeden Aktionsaufruf für Ihren Controller zu erfassen.quelle
ExecuteAsync
wird vom Framework aufgerufen, und die Implementierung der Basis-Controller-Klasse bewirkt, dass die Aktion tatsächlich ausgeführt wird. Dies ist nur ein Aufruf Ihrer Protokollierung als Teil der bereits laufenden Ausführung. Die einzige Strafe hier ist die Zeit für die eigentliche Protokollierung.Dies scheint ein ziemlich alter Thread zu sein, aber wir teilen eine andere Lösung.
Sie können diese Methode in Ihre global.asax-Datei einfügen, die jedes Mal nach dem Ende der HTTP-Anforderung ausgelöst wird.
quelle
Dies ist ein wirklich altes Thema, aber ich habe viel Zeit damit verbracht (im Internet zu suchen), um diese Sache zu tun, also werde ich einfach meine Lösung hier posten.
Konzept
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
quelle