Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF。自定义编码器中的绑定请求和响应_C#_.net_Wcf - Fatal编程技术网

C# WCF。自定义编码器中的绑定请求和响应

C# WCF。自定义编码器中的绑定请求和响应,c#,.net,wcf,C#,.net,Wcf,我有一个wcf客户端,我需要记录来自外部服务的请求和响应。 我可以在自定义消息编码器中执行此操作,但我需要一些相关Id来创建如下文件:Id\u request.xml和Id\u response.xml。 所以我的问题是如何将一些字符串从ReadMessage传递到WriteMessage 我试图使用IClientMessageInspector的实现,但WCF在编码之前调用了BeforeSendRequest,消息不完整。此外,我无法将请求和响应都保存在“AfterReceivePly”中,因

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


我试图使用
IClientMessageInspector
的实现,但WCF在编码之前调用了
BeforeSendRequest
,消息不完整。此外,我无法将请求和响应都保存在“AfterReceivePly”中,因为我的应用程序(或外部服务)可能在发送请求后但在收到响应之前崩溃。

我找到了一个适合我的解决方案。在我的
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..
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
  var correlationObject = (CorrelationObject) correlationState;
  File.WriteAllText(correlationObject.ResponseFileName,
    reply.Properties["RawMessage"].ToString());
}