C# 如何记录代理类发送到web服务的XML?

C# 如何记录代理类发送到web服务的XML?,c#,web-services,C#,Web Services,我从WSDL URL生成了一个代理类。我可以向它发送请求,但我需要记录发送的XML。我该怎么做呢?我已经通过实现IDispatchMessageInspector实现了服务器端,如前所述。但是,我相信通过实现接口,您可以在客户端完成同样的事情 如果我没记错的话,.ToString()方法返回SOAP,您可以直接将其放入日志中 然而,我相信有一个gotcha只是服务器端的,但我会在这里提到它,因为它可能不是 Message类被设计为只读取一次。由于您正在拦截消息以记录它,因此需要确保避免将其标记为

我从WSDL URL生成了一个代理类。我可以向它发送请求,但我需要记录发送的XML。我该怎么做呢?

我已经通过实现IDispatchMessageInspector实现了服务器端,如前所述。但是,我相信通过实现接口,您可以在客户端完成同样的事情

如果我没记错的话,.ToString()方法返回SOAP,您可以直接将其放入日志中

然而,我相信有一个gotcha只是服务器端的,但我会在这里提到它,因为它可能不是

Message类被设计为只读取一次。由于您正在拦截消息以记录它,因此需要确保避免将其标记为“已读”作为副作用。您必须像这样克隆它:

public class ClientMessageLogger : IClientMessageInspector
{
    public void AfterReceiveReply(
        ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        // Do nothing.
    }

    public object BeforeSendRequest(
        ref System.ServiceModel.Channels.Message request, IClientChannel channel)
    {
        // Create a buffer.
        MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);

        // Set the request reference to an unspoiled clone.
        request = buffer.CreateMessage();

        // Make another unspoiled clone to process (taint) locally within this method.
        Message originalMessage = buffer.CreateMessage();

        // Log the SOAP xml.
        Log(originalMessage.ToString());

        return null;
    }
}

您不需要自己编写代码来完成此操作:只要

您还可以打开SOAP日志记录,以防您不使用WCF:


这必须发生在客户端,还是服务器端日志记录解决方案也可以接受?我不能控制服务器端,所以必须是客户端。我试过了,但一辈子都不能让客户端记录任何东西。@我的另一个我-只是好奇,但这是客户端的问题吗?如果没有,我将从我的答案中删除它。