2016-04-08 5 views
1

Ich habe Nachrichten untersucht, die in einem WCF-basierten System mit dem verfügbaren IClientMessageInspector (und IDispatchMessageInspector) gesendet wurden.C# WCF - Erstellen von benutzerdefiniertem Nachrichteninhalt

Derzeit versuche ich XML manuell zu der Nachricht hinzuzufügen, ich kann es nicht funktionieren.

Situation: Eingehende Nachricht hat einen Körper wie

<s:Body> 
    <Type xmlns="http://schemas.microsoft.com/2003/10/Serialization/"> 
    ... 
    </Type> 
</s:Body> 

ich den ganzen Körper mit benutzerdefinierten Inhalt ersetzt werden soll, manuell in einem String strukturiert. Das heißt, ich habe einen korrekten XML-Body in einem String, den ich in den Nachrichtentext einfügen möchte.

Ist das überhaupt möglich?

Edit: Um die Frage weiter zu klären: Kann ich irgendwie auf den "Rohtext" der Nachricht zugreifen und diesen bearbeiten?

Edit2: I.e. Ich mag die Original-Header und alle aus der eingehenden Nachricht halten, will aber alles zwischen

<body> </body> 

mit meinem benutzerdefinierten Inhalt ersetzen, die derzeit in einer Zeichenfolge befindet.

Antwort

1

Sie ähnlichen Ansatz zu einem in diesem Blog-Eintrag https://blogs.msdn.microsoft.com/kaevans/2008/01/08/modify-message-content-with-wcf/

Kurz verwenden könnten Sie EndpointBehavior in denen hinzufügen Sie benutzerdefinierte MessageInspector hinzu:

Service1Client proxy = new Service1Client(); 
proxy.Endpoint.Behaviors.Add(new MyBehavior()); 

public class MyBehavior : IEndpointBehavior 
{ 
     public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) 
     { 
      MyInspector inspector = new MyInspector(); 
      clientRuntime.MessageInspectors.Add(inspector); 
     } 
} 

public class MyInspector : IClientMessageInspector 
{ 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState) 
    { 
     var xml = "XML of Body goes here"; 
     var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml)); 
     XmlDictionaryReader xdr = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas()); 

     Message replacedMessage = Message.CreateMessage(reply.Version, null, xdr); 
     replacedMessage.Headers.CopyHeadersFrom(reply.Headers); 
     replacedMessage.Properties.CopyProperties(reply.Properties); 
     reply = replacedMessage; 
    } 
} 

EDIT: hinzugefügt MemoryStream mit Daten aus einem eingeleitet string Wert.

+0

Ja, tut mir leid. Ich hatte ein bisschen Kummer, weil ich es geschafft hatte, den XML-Teil falsch zu schneiden, und hatte immer noch Soap-Tags von der Kommunikation übrig. Aber nach der Erkenntnis funktioniert es wie ein Zauber. Also vielen Dank! – Mattedatten

Verwandte Themen