2011-01-03 9 views
3

Ich versuche, eine einfache Botschaft Inspektor zu implementieren, die die Nachricht an das Debug-Fenster von einem Beispiel on MSDN schreibt:WCF Überprüfen Sie Nachrichten

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()); 
    } 
} 

Die Antwort schreibt, wie erwartet. Die Anfrage scheint jedoch null zu sein. Irgendwelche Ideen, was könnte schief gehen? Ich verwende einen Service-Referenz-Proxy mit einer Konsolen-App als Client.

Ich verwende basicHttpbinding und hosting mit IIS mit SVC-Datei. Der Parameter für meine Webmethode ist ein komplexer Typ. Ich bin mir nicht sicher, ob das einen Unterschied macht.

Antwort

1

Versuchen Sie CreateBufferedCopy (d. H. Klon) der Nachrichtenanforderung zuerst: http://msdn.microsoft.com/en-us/library/ms734675.aspx (Kopieren einer Nachricht in einen Puffer).

Mehr Infos hier unter „Jetzt für die Nachrichten Prüfteilbilder“: http://binarymist.net/2010/06/14/message-inspection-in-wcf/

+0

Danke für die Info. Ich habe versucht, einen Puffer zu erstellen, aber immer noch nicht funktioniert. Ich werde das Beispiel in Ihrem Link auch versuchen. – Quadwwchs

+0

Anforderungspuffer wird für 'request.ToString()' nicht benötigt. –

+1

Der MSDN-Link gibt in Bezug auf "Extrahieren von Nachrichtentextdaten" an: Sie können auf den Nachrichtentext nur einmal zugreifen, unabhängig davon, wie darauf zugegriffen wird. Ein Nachrichtenobjekt verfügt über eine State-Eigenschaft, die anfänglich auf Created festgelegt ist. Die drei in der vorhergehenden Liste beschriebenen Zugriffsmethoden setzen den Status auf Geschrieben, Gelesen und Kopiert. Darüber hinaus kann eine Close-Methode den Status auf Geschlossen setzen, wenn der Inhalt des Nachrichtenhauptteils nicht mehr benötigt wird. Auf den Nachrichtentext kann nur im Status Erstellt zugegriffen werden, und es gibt keine Möglichkeit, nach dem Statuswechsel in den Status Erstellt zurückzukehren. – Junto

0

Ich habe Kopie und die MyMessageInspector Klasse eingefügt und das Verhalten meiner meines Web-Service hinzugefügt, und es funktioniert gut - wenn der Web-Service ist aufgerufen, wird der SOAP-Umschlag als XML gedruckt.

Haben Sie weitere MessageInspectors in Ihrem Projekt? Wenn ja, ist es möglich, dass einer von ihnen request = null setzt - dies wird das Problem verursachen, das Sie haben, da der Anforderungsparameter ref ist.

Wenn nicht, was macht Sie sagen Anfrage ist null? Erhalten Sie eine NullReferenceException für die Debug.WriteLine(..)-Anweisung?