J'utilise Microsoft Asp.net WebApi2 hébergé sur IIS. Je voudrais très simplement enregistrer le corps de la requête (XML ou JSON) et le corps de la réponse pour chaque message.
Il n'y a rien de spécial à propos de ce projet ou du contrôleur qui traite la publication. Je ne suis pas intéressé par l'utilisation de cadres de journalisation tels que nLog, elmah, log4net ou les fonctionnalités de traçage intégrées de l'API Web, sauf si cela est nécessaire.
Je veux simplement savoir où mettre mon code de journalisation et comment obtenir le JSON ou XML réel à partir de la demande et de la réponse entrantes et sortantes.
Ma méthode de publication de contrôleur:
public HttpResponseMessage Post([FromBody])Employee employee)
{
if (ModelState.IsValid)
{
// insert employee into to the database
}
}
c#
asp.net-web-api
utilisateur2315985
la source
la source
Réponses:
Je recommanderais d'utiliser un fichier
DelegatingHandler
. Ensuite, vous n'aurez pas à vous soucier du code de journalisation dans vos contrôleurs.Remplacez simplement
Trace.WriteLine
par votre code de journalisation et enregistrez le gestionnaireWebApiConfig
comme ceci:Voici la documentation Microsoft complète pour les gestionnaires de messages .
la source
task.Result.Content
revientSystem.Net.Http.ObjectContent
. Existe-t-il un moyen d'obtenir le xml / json brut à la place?ContinueWith
etResult
sont des API dangereuses. Il serait de loin préférable d'utiliser à laawait
place, c'est-à-direvar result = await base.SendAsync(request, cancellationToken); var resposeBody = await response.Content.ReadAsStringAsync(); Trace.WriteLine(responseBody); return response;
await request.Content.ReadAsStringAsync();
not entraîne-t-il une erreur indiquant que le flux de demande a déjà été lu dans certaines circonstances?Il existe plusieurs approches pour gérer de manière générique la journalisation des demandes / réponses pour chaque appel de méthode WebAPI:
ActionFilterAttribute
: On peut écrire sur mesureActionFilterAttribute
et décorer les méthodes contrôleur / action pour activer la journalisation.Vous devez décorer chaque contrôleur / méthode (vous pouvez toujours le faire sur le contrôleur de base, mais cela ne résout toujours pas les problèmes transversaux.
Remplacez
BaseController
et gérez la journalisation là-bas.Inconvénient: Nous attendons / forçons les contrôleurs à hériter d'un contrôleur de base personnalisé.
Utilisation
DelegatingHandler
.Avantage: Nous ne touchons pas ici au contrôleur / méthode avec cette approche. Le gestionnaire de délégation est isolé et gère correctement la journalisation des demandes / réponses.
Pour un article plus détaillé, reportez-vous à http://weblogs.asp.net/fredriknormen/log-message-request-and-response-in-asp-net-webapi .
la source
L'une des options que vous avez consiste à créer un filtre d'action et à décorer votre WebApiController / ApiMethod avec.
Attribut de filtre
Contrôleur WebApi
ou
J'espère que cela t'aides.
la source
L'accès au message de demande est facile. Votre classe de base
ApiController
contient une.Request
propriété qui, comme son nom l'indique, contient la requête sous forme analysée. Il vous suffit de l'examiner pour tout ce que vous cherchez à enregistrer et de le transmettre à votre installation de journalisation, quelle qu'elle soit. Ce code, vous pouvez le mettre au début de votre action, si vous devez le faire pour une seule ou une poignée.Si vous devez le faire sur toutes les actions (toutes signifiant plus qu'une poignée gérable), alors ce que vous pouvez faire est de remplacer la
.ExecuteAsync
méthode pour capturer chaque appel d'action pour votre contrôleur.la source
ExecuteAsync
est ce qui est appelé par le framework, et l'implémentation de la classe de contrôleur de base est ce qui fait réellement exécuter l'action. Il s'agit simplement d'appeler votre journalisation dans le cadre d'une exécution déjà en cours. La seule pénalité ici est le temps de faire la journalisation réelle.Cela semble être un fil assez ancien mais partageant une autre solution.
Vous pouvez ajouter cette méthode dans votre fichier global.asax qui sera déclenché après la fin de la requête HTTP.
la source
C'est un sujet très ancien mais j'ai passé beaucoup de temps (recherche sur Internet) à faire ces choses, je vais donc simplement publier ma solution ici.
Concept
1. MyController.cs
2. APIActionFilter.cs
3. APIExceptionFilter.cs
la source