【问题标题】:WCF. Bind request and response in custom encoderWCF。在自定义编码器中绑定请求和响应
【发布时间】:2016-06-02 13:26:09
【问题描述】:

我有一个 wcf 客户端,我需要记录来自外部服务的请求和响应。 我可以在我的自定义消息编码器中执行此操作,但我需要一些相关 ID 来创建如下命名的文件:id_request.xmlid_response.xml。 所以我的问题是如何将一些字符串从ReadMessage 传递给WriteMessage

我尝试使用我的IClientMessageInspector 实现,但WCF 在编码之前调用BeforeSendRequest 并且消息不完整。此外,我无法在AfterReceiveReply 中同时保存请求和响应,因为我的应用程序(或外部服务)可能会在我发送请求之后但在收到响应之前崩溃。

【问题讨论】:

    标签: c# .net wcf


    【解决方案1】:

    我找到了适合我的解决方案。在IClientMessageInspector 的实现中,我创建了CorrelationObject 类:

    class CorrelationObject
    {
      public string RequestFileName { get; set; }
      public string ResponseFileName { get; set; }
    }
    

    然后在BeforeSendRequest 中生成具有相同 ID 作为前缀的唯一名称,并将该关联对象存储在请求属性中:

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

    现在,两个文件都以相同的前缀保存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 2019-04-06
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多