La journalisation HTTP brut de requête/réponse en ASP.NET MVC & IIS7
Je suis en train d'écrire un web service (à l'aide de ASP.NET MVC) et à des fins de soutien que nous aimerions être en mesure d'ouvrir une session à la demande et de la réponse d'aussi près que possible de la première, sur-le-fil format (j'.e y compris la méthode HTTP, chemin d'accès, tous les en-têtes et le corps) dans une base de données.
Ce que je ne suis pas sûr, c'est la façon de mettre la main sur ces données dans le moins de déformation de la voie. Je peux re-constituer ce que je crois à la demande de recherche comme par l'inspection de toutes les propriétés de la HttpRequest
objet et la construction d'une chaîne à partir d'eux (et de même pour la réponse), mais je voudrais vraiment obtenir de la demande/réponse de données qui sont envoyés sur le réseau.
Je suis heureux d'utiliser toute interception mécanisme tels que les filtres, modules, etc. et la solution peut être spécifique à IIS7. Cependant, je préfère le garder en code managé seulement.
Toutes les recommandations?
Edit: je remarque que HttpRequest
a un enregistrer sous
méthode qui peut enregistrer la demande sur le disque, mais ceci reconstruit à la demande de l'état interne à l'aide d'une charge interne des méthodes d'assistance qui ne sont pas accessibles publiquement (tout à fait pourquoi cela ne permet pas de sauvegarder à un utilisateur fourni par flux je ne sais pas). Donc, ça commence à ressembler à ce que je vais faire de mon mieux pour reconstruire la demande/réponse de texte à partir des objets... gémissement.
Edit 2: Veuillez noter que j'ai dit la ensemble demande, y compris la méthode, le chemin, en-têtes, etc. Les réponses actuelles ne regarde que le corps des flux qui ne comprennent pas cette information.
Edit 3: personne Ne lire les questions ici? Cinq réponses jusqu'à présent et pourtant, pas un, même fait allusion à un moyen d'obtenir l'ensemble de la crue sur-le-fil demande. Oui, je sais que je peux capter les flux de sortie et les en-têtes et les URL et tout ça à partir de l'objet de la requête. J'ai déjà dit que, dans la question, voir:
Je peux re-constituer ce que je crois à la demande de recherche comme par l'inspection de toutes les propriétés de l'objet HttpRequest et la construction d'une chaîne à partir d'eux (et de même pour la réponse), mais je voudrais vraiment obtenir de la demande/réponse de données qui sont envoyés sur le réseau.
Si vous connaissez la complète données brutes (y compris les en-têtes, url, la méthode http, etc.) ne peut tout simplement pas être récupérés puis ce serait utile de le savoir. De même, si vous savez comment l'obtenir tous dans le format " raw " (oui, je persiste à dire y compris les en-têtes, url, la méthode http, etc.) sans avoir à reconstruire, ce qui est ce que j'ai demandé, alors que ce serait très utile. Mais me dire que je peut reconstruire à partir de la HttpRequest
/HttpResponse
objets n'est pas utile. Je sais qu'. Je l'ai déjà dit il.
Veuillez noter: Avant que quelqu'un commence à dire que c'est une mauvaise idée, ou à la limite de l'évolutivité, etc., nous allons également être mise en œuvre de la limitation, de livraison séquentiel et anti-replay mécanismes dans un environnement distribué, donc de la base de données de journalisation est nécessaire de toute façon. Je ne suis pas à la recherche pour une discussion de savoir si c'est une bonne idée, je suis à la recherche de la façon dont il peut être fait.
- Non, c'est un service RESTful mis en œuvre à l'aide de ASP.NET MVC
- Il est probablement possible de le faire à l'aide de IIS7 et un module natif - msdn.microsoft.com/en-us/library/ms694280.aspx
- Avez-vous réussi à mettre en place cela? Juste par curiosité, avez-vous adopté une mémoire tampon de la stratégie à écrire db?
- Projet intéressant... si vous ne finissent par le faire, avec de la solution finale?
Vous devez vous connecter pour publier un commentaire.
Certainement utiliser un
IHttpModule
et de mettre en œuvre laBeginRequest
etEndRequest
événements.Toutes les données "brutes" est présent entre
HttpRequest
etHttpResponse
, il n'est tout simplement pas dans un seul format raw. Voici les pièces nécessaires pour construire Fiddler style décharges (à peu près aussi proche de HTTP brut qu'il obtient):Pour la réponse:
Noter que vous ne pouvez pas lire le flux de réponse donc, vous devez ajouter un filtre pour le flux de Sortie et capturer une copie.
Dans votre
BeginRequest
, vous aurez besoin d'ajouter un filtre de réponse:Magasin
filter
où vous pouvez l'obtenir dans leEndRequest
gestionnaire. Je suggère dansHttpContext.Items
. Il suffit ensuite de récupérer l'intégralité des données de réponse dansfilter.ReadStream()
.Puis de mettre en œuvre
OutputFilterStream
à l'aide de la Décoratrice modèle comme un wrapper autour d'un ruisseau:StreamReader
, lerequest.InputStream.Length
est de 0. Après la lecture de ce reference c'est juste un stupide chat.La suite de la méthode d'extension sur HttpRequest va créer une chaîne qui peut être collé dans fiddler et relus.
HttpRequestBaseExtensions
et de changerHttpRequest
àHttpRequestBase
à chaque endroit.Vous pouvez utiliser le ALL_RAW variable de serveur pour obtenir l'original des en-têtes HTTP envoyés avec la demande, vous pouvez obtenir le InputStream comme d'habitude:
découvrez: http://msdn.microsoft.com/en-us/library/ms524602%28VS.90%29.aspx
HttpContext.Current.Request
pour saisir le contexte actuel à l'extérieur de contrôleurs MVC, les pages ASPX, etc... assurez-vous qu'il n'est pas null premier 😉Bien, je suis en train de travailler sur un projet et n'a, peut-être pas trop profonde, d'un journal à l'aide de la demande params:
Prendre un coup d'oeil:
Vous pouvez décorer vos contrôleurs de classe pour le journal entièrement:
journal ou juste certaines méthodes d'action
Une raison quelconque vous avez besoin de le garder dans le code managé?
Il vaut la peine de mentionner que vous pouvez activer Échec de l'enregistrement des Traces dans IIS7 si vous n'aimez pas ré-inventer la roue. Ce dernier enregistre les en-têtes, de la demande et de la réponse du corps ainsi que beaucoup d'autres choses.
GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
à la fin deRegister(..)
dansWebApiConfig.cs
, mais cela peut varier entre les versions.Je suis allé avec McKAMEY de l'approche. Voici un module que j'ai écrit qui vous permettra de commencer et j'espère vous faire économiser du temps. Vous aurez besoin de brancher l'Enregistreur à l'évidence avec quelque chose qui fonctionne pour vous:
Encoding.UTF8
, ou peut-êtreEncoding.Default
lors de la lecture de la demande de flux? Ou tout simplement utiliser unStreamReader
(dans l'élimination des avertissements)OK, donc il semble que la réponse est "non vous ne pouvez pas obtenir les données brutes, vous devez reconstruire la demande/réponse à partir des propriétés de l'analyse des objets". Eh bien, j'ai fait de la reconstruction chose.
utiliser un IHttpModule:
si, pour une utilisation occasionnelle, un virage serré, que penser de quelque chose de brut, comme ci-dessous?
Vous pouvez accomplir ceci dans une
DelegatingHandler
sans l'aide de laOutputFilter
mentionné dans d'autres réponses .NET 4.5 utilisation de laStream.CopyToAsync()
fonction.Je ne suis pas sûr que sur les détails, mais elle ne déclenche pas toutes les mauvaises choses qui se passera si vous essayez de lire directement le flux de réponse.
Exemple:
Je sais que c'est pas de code managé, mais je vais proposer un filtre ISAPI. Il a été une couple d'années depuis que j'ai eu le "plaisir" de l'entretien de mon propre ISAPI, mais de ce que je me souviens vous pouvez obtenir l'accès à tout ça, à la fois avant et après ASP.Net il l'a fait la chose.
http://msdn.microsoft.com/en-us/library/ms524610.aspx
Si un HTTPModule n'est pas assez bon pour ce que vous avez besoin, alors je ne pense pas qu'il y a tout géré de façon de le faire dans la quantité requise de détail. Ça va être une douleur à faire.
Je suis d'accord avec les autres, utiliser un IHttpModule. Jetez un oeil à la réponse à cette question, qui fait à peu près la même chose que ce que vous demandez. Il enregistre la demande et de la réponse, mais sans les en-têtes.
Comment tracer ScriptService WebService demandes?
Il pourrait être préférable de le faire à l'extérieur de votre application. Vous pouvez configurer un serveur proxy inverse pour faire des choses comme ça (et beaucoup plus). Un reverse proxy est fondamentalement un serveur web qui se trouve dans votre salle de serveur, et se dresse entre votre serveur web et le client. Voir http://en.wikipedia.org/wiki/Reverse_proxy
D'accord avec FigmentEngine,
IHttpModule
semble être la voie à suivre.Regarder dans
httpworkerrequest
,readentitybody
etGetPreloadedEntityBody
.Pour obtenir le
httpworkerrequest
vous avez besoin pour ce faire:où
inApp
est l'objet httpapplication.HttpRequest
etHttpResponse
pré MVC utilisé pour avoir unGetInputStream()
etGetOutputStream()
qui pourrait être utilisé à cette fin. N'avez pas l'air dans ceux de la partie MVC, donc je ne suis pas sûr qu'ils seront disponibles, mais peut-être une idée 🙂