Question

J'ai un service WCF hébergé dans IIS / ASP.NET qui accepte HTTP Post ( ne forment après ) d'objets sérialisés.

Si le client envoie des requêtes malformées (par exemple, ils ne sont pas l'objet sérialisation correctement) Je voudrais enregistrer le message envoyé vers le haut.

Nous utilisons déjà ELMAH pour capturer des exceptions non gérées, si simplement attacher les données post serait l'option la plus simple.

Je peux obtenir le courant HttpContext au cours d'une exception, mais cela ne contient que les informations en-tête HTTP.

Ma question est la suivante: Est-il possible de capturer le corps de la requête HTTP POST original? Ou, à défaut - une meilleure façon (sans proxy inverse) de capturer l'entrée qui a causé l'erreur?

Edit: Juste pour clarifier, en cours d'exécution capture au niveau des paquets en tout temps n'est pas vraiment approprié. Je suis après une solution que je peux déployer sur des serveurs de production, et qui ont des clients hors de notre contrôle ou la capacité à surveiller.

Edit # 2: Une suggestion a été faite pour accéder au Request.InputStream - cela ne fonctionne pas si vous essayez de lire après WCF a lu la demande de cours d'eau.

Un morceau de l'échantillon de code pour voir comment j'ai essayé d'utiliser c'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: ""
Était-ce utile?

La solution

Au moment où il arrive à votre service la demande est traitée et non à votre disposition.

Mais ... vous pouvez joindre un inspecteur de message . Les inspecteurs de message vous permettent de jouer avec le message avant qu'il atteigne vos implémentations de fonctionnement. Vous pouvez créer une copie en mémoire tampon du message et la copier dans le OperationContext.Current.

bidouille laid bien sûr, et cela signifie que les frais généraux de mémoire maintenant deux copies du message sont flottaient pour chaque demande.

Autres conseils

Avez-vous regardé la propriété System.Web.Request.InputStream? Il devrait avoir exactement ce que vous voulez.

Comment "retour rapide" la propriété InputStream.

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

Une autre option que vous devriez regarder dans capture ces informations avec un HttpModule sur l'événement BeginRequest. Les données devraient être là à l'événement BeginRequest parce que je ne crois pas WCF prend la demande jusqu'à ce PostAuthenticateEvent.

sous ASP.NET (service Web ASP sous IIS) le code suivant aide:

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF peut-être différent (qui est elle dispose InputStream après l'avoir lu)

Fiddler. Sans SP. Fonctionne très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top