2016-06-02 3 views
1

Ich habe einen WCF-Client und ich muss meine Anfragen und Antworten von externen Service zu protokollieren. Ich kann dies in meinem benutzerdefinierten Nachrichtenencoder tun, aber ich brauche eine Korrelations-ID, um Dateien wie diese zu erstellen: id_request.xml und id_response.xml. Also meine Frage ist, wie man eine Zeichenfolge von ReadMessage zu WriteMessage übergeben?WCF. Bind Anfrage und Antwort in benutzerdefinierten Encoder

Ich versuchte, meine Implementierung von IClientMessageInspector zu verwenden, aber WCF ruft BeforeSendRequest auf, bevor Codierung und Nachricht unvollständig ist. Ich kann auch nicht sowohl die Anfrage als auch die Antwort in AfterReceiveReply speichern, da es möglich ist, dass meine Anwendung (oder externer Dienst) abgestürzt ist, nachdem ich eine Anfrage gesendet habe, aber bevor die Antwort empfangen wurde.

Antwort

1

Ich fand eine Lösung, die für mich funktioniert. In meiner Implementierung von IClientMessageInspector erstellt I Klasse CorrelationObject:

dann in BeforeSendRequest erzeuge ich einen eindeutigen Namen mit gleichen Id als Präfix und speichern, dass die Korrelation Objekt in Anfrage Eigenschaften:

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
{ 
    var id = Guid.NewGuid(); 
    var correlationObject = new CorrelationObject 
    { 
    RequestFileName = $"{id:N}_request.xml", 
    ResponseFileName = $"{id:N}_response.xml" 
    }; 
    request.Properties.Add("CorrelationObject", correlationObject); 
    return correlationObject; 
} 

Danach, WCF Pass meine Anfrage an den Nachrichtengeber

public override ArraySegment<byte> WriteMessage(Message message, 
    int maxMessageSize, BufferManager bufferManager, int messageOffset) 
{ 
    // encoding and signing 
    var encodedMessage = string.Empty; 
    var correaltionObject = (CorrelationObject) message.Properties["CorrelationObject"]; 
    File.WriteAllText(correaltionObject.RequestFileName, encodedMessage); 
} 

An dieser Stelle habe ich meine Anfrage gespeichert. Um Antwort, in der Nachrichten Encoder zu speichern Ich habe folgende:

public override Message ReadMessage(ArraySegment<byte> buffer, 
    BufferManager bufferManager, string contentType) 
{ 
    var content = Encoding.UTF8.GetString(buffer.ToArray()); 
    var response = innerEncoder.ReadMessage(buffer, bufferManager, contentType); 
    response.Properties.Add("RawMessage", content); 

    // some other staff here.. 
} 

Und jetzt WCF ruft AfterReceiveReply in meiner Nachricht Inspektor

public void AfterReceiveReply(ref Message reply, object correlationState) 
{ 
    var correlationObject = (CorrelationObject) correlationState; 
    File.WriteAllText(correlationObject.ResponseFileName, 
    reply.Properties["RawMessage"].ToString()); 
} 

Nun werden beide Dateien mit dem gleichen Präfix gespeichert.