J'ai un service WCF hébergé dans IIS/ASP.NET qui accepte HTTP Post (ne forme pas le poste) d'objets sérialisés.Capture de données HTTP POST brutes pendant l'exception
Si le client envoie des requêtes mal formées (par exemple, il ne sérialise pas correctement l'objet), je souhaite enregistrer le message envoyé.
Nous utilisons déjà ELMAH pour capturer des exceptions non gérées, donc la simple association des données de publication serait l'option la plus simple.
Je peux obtenir le HttpContext courant pendant une exception, mais cela ne contient que les informations d'en-tête HTTP.
Ma question est la suivante: existe-t-il un moyen de capturer le corps de la requête HTTP POST d'origine? Ou, à défaut - une meilleure façon (sans un proxy inverse) de capturer l'entrée qui a causé l'erreur? Edit: Juste pour clarifier, l'exécution de la capture au niveau des paquets à tout moment n'est pas vraiment appropriée. Je suis après une solution que je peux déployer sur des serveurs de production, et qui aura des clients en dehors de notre contrôle ou de notre capacité à surveiller. Éditer # 2: Une suggestion a été faite pour accéder à Request.InputStream - ceci ne fonctionne pas si vous essayez de lire après que WCF ait lu la demande hors du flux.
Un exemple de code pour voir comment j'ai essayé d'utiliser ceci est ici.
StringBuilder log = new StringBuilder();
var request = HttpContext.Current.Request;
if (request.InputStream != null)
{
log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
if (request.InputStream.Position != 0)
{
request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}
using (StreamReader sr = new StreamReader(request.InputStream))
{
log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
}
}
else
{
log.AppendLine("request.Inputstream = null");
}
log.ToString();
Le ouput de log.ToString() est la suivante:
request.InputStream.Position = "0" Original Input: ""
Le "utilisant" avec StreamReader résultera dans le System.Web.Request.InputStream étant éliminé (ce qui signifie que les données sont perdues). – Jeff
Les données sont déjà perdues. –