Comment consigner la requête brute dans le service WCF

J'ai un service WCF avec plusieurs méthodes. Je voudrais journal de la demande brute qui venait du client, indépendamment de la façon dont cela a été envoyé. Une méthode accepte les données en tant que querystring (strictement pour la prise en charge héritée) qui je peux me connecter en utilisant:

OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri

Qui est suffisante dans le scénario, mais d'autres méthodes de permettre au client d'envoyer des données au format XML à l'aide d'une classe proxy généré par svcutil.exe. Dans ce scénario, j'ai trouvé les données que je veux dans la s:Corps:

OperationContext.Current.RequestContext.RequestMessage

Malheureusement, peu importe ce que j'essaie je ne peux pas créer un tampon de copie du message avant de lire. Voici un exemple:

public CascadeResponse SendCustomer(Customer c)
    {
        Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
        LogMessage(msg);
        //Now that the request is logged, get on with the rest
    }

Sur la première ligne de SendCustomer, cependant, j'obtiens l'erreur suivante:

Ce message ne peut pas soutenir l'opération car il a été lu.

C'est le point de moi de la création de la mémoire tampon de copie, sûrement? Je suppose que je suis en train de faire quelque chose de forte essence du mal ici.

Edit:

Ok, donc la méthode est maintenant comme ceci:

public CascadeResponse SendCustomer(Message requestMessage)
    {
        Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
        LogMessage(msg);
        //Now that the request is logged, get on with the rest        
        Customer c = msg.GetBody<Customer>();
        string clientKey = "1111"; //This should be the clientKey string passed to the function along with the customer 
        return SendLead(c, clientKey);
    }

Mon problème est que je ne sais pas comment pour obtenir le Client et ClientKey envoyé en tant qu'entités distinctes. J'ai pu faire clientKey une propriété du Client (ou de créer un objet personnalisé qui est spécifiquement conçu pour la transmission des données et contient à la Clientèle et ClientKey comme des attributs), mais je voudrais éviter, si possible, que c'est une mise à niveau d'un système existant qui fonctionne déjà de cette façon.

Je suis aussi de la difficulté à l'aide de svcUtil.exe pour créer mes classes proxy - je suppose que le fait d'avoir la méthode ci-dessus signature signifie que mon service ne sera plus de la publicité de la signature correcte pour envoyer des demandes? Pas sûr si c'est assez clair - si ma seule méthode d'entrée accepte un objet de Message, comment est-ce que mon client sait à envoyer à un Client et un ClientKey?

source d'informationauteur Maloric