2011-01-03 2 views
3

Inspectez Je suis en train de mettre en œuvre un inspecteur message simple qui écrit le message à la fenêtre de débogage à partir d'un exemple on MSDN:WCF Messages

public class MyMessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     System.Diagnostics.Debug.WriteLine(request.ToString()); 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     System.Diagnostics.Debug.WriteLine(reply.ToString()); 
    } 
} 

La réponse est en train d'écrire comme prévu. Cependant, la requête semble être nulle. Des idées sur ce qui pourrait aller mal? J'utilise un proxy de référence de service avec une application de console en tant que client. J'utilise basicHttpbinding et l'hébergement avec IIS avec le fichier svc. Le paramètre de ma méthode Web est un type complexe. Je ne suis pas sûr que cela fasse une différence.

Répondre

1

Essayez CreateBufferedCopy (par exemple, clone) de la demande de message en premier: http://msdn.microsoft.com/en-us/library/ms734675.aspx (Copie d'un message dans un tampon).

Plus d'infos ici sous la rubrique « Maintenant, pour la partie d'inspection du message »: http://binarymist.net/2010/06/14/message-inspection-in-wcf/

+0

Merci pour l'info. J'ai essayé de créer un tampon mais je ne travaille toujours pas. Je vais essayer l'exemple dans votre lien aussi. – Quadwwchs

+0

Le tampon de demande n'est pas nécessaire pour 'request.ToString()'. –

+1

L'état des liens MSDN en ce qui concerne "Extraction des données du corps du message": Vous pouvez accéder au corps d'un message qu'une seule fois, indépendamment de la façon dont il est accédé. Un objet de message a une propriété State, qui est initialement définie sur Created. Les trois méthodes d'accès décrites dans la liste précédente définissent l'état sur Écrit, Lecture et Copié, respectivement. En outre, une méthode Close peut définir l'état sur Fermé lorsque le contenu du corps du message n'est plus requis. Le corps du message est accessible uniquement dans l'état Créé et il n'existe aucun moyen de revenir à l'état Créé après la modification de l'état. – Junto

0

Je copie et collé la classe MyMessageInspector et a ajouté le comportement à mon mon service web, et il fonctionne très bien - lorsque le service Web est appelé, l'enveloppe SOAP est imprimée en XML.

Avez-vous d'autres MessageInspectors dans votre projet? Si tel est le cas, il est possible que l'un d'entre eux définisse request = null - cela entraînera le problème que vous rencontrez, car le paramètre de demande est ref.

Sinon, qu'est-ce qui vous fait dire que la requête est nulle? Obtenez-vous une exception NullReferenceException sur l'instruction Debug.WriteLine(..)?

Questions connexes