2016-06-02 3 views
1

У меня есть wcf-клиент, и мне нужно регистрировать мои запросы и ответы от внешних служб. Я могу сделать это в своем специальном кодеджере сообщений, но мне нужен идентификатор корреляции для создания файлов, названных так: id_request.xml и id_response.xml. Так что мой вопрос в том, как передать некоторую строку от ReadMessage до WriteMessage?WCF. Запрос связывания и ответ в пользовательском кодере

Я попытался использовать мою реализацию IClientMessageInspector, но WCF вызывает BeforeSendRequest перед кодированием и сообщение является неполным. Также я не могу сохранить как запрос, так и ответ в AfterReceiveReply, потому что возможно, что мое приложение (или внешняя служба) будет разбито после отправки запроса, но до получения ответа.

ответ

1

Я нашел решение, которое работает для меня. В моей реализации IClientMessageInspector я создал класс CorrelationObject:

затем в BeforeSendRequest я генерировать уникальные имена с тем же идентификатором, как префикс и хранить, что корреляционная объект запроса свойств:

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

После этого WCF проход мой запрос к датчику сообщений

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

На данный момент я сохранил запрос. Для того, чтобы сохранить ответ, кодировщик сообщение я следующее:

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.. 
} 

А теперь WCF вызывает AfterReceiveReply в моем сообщении инспектора

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

Теперь оба файла сохраняется с префиксом.