如何准确记录WCF客户端发送和接收的消息

8
请不要使用WCF Trace工具回答,除非给出明确的指示以捕获实际消息,包括标头和故障。此链接无效。
另外,请不要回答IClientMessageInspector,除非您知道如何使其包含所有标头(它不包含),并捕获无法解析的故障元素的响应。
在预WCF Web服务中,您可以编写一个完美运行的SoapExtension
3个回答

4

编写一个自定义消息编码器,它可以访问所有标头。根据您希望解决的问题的通用性,您可能需要编写它以便在构造函数中获取真正的编码器。

就在几天前,我在这个线程中实现了一个“包装器编码器”。该编码器改变了消息。您不需要这样做,您可以像我一样只记录并将其传递给传输。


我稍后需要尝试这个。我真的很想直接以人类可读格式登录到我们现有的日志中。 - JohnOpincar
你需要使用WCF日志记录,而不是WCF跟踪。请参见此处http://msdn.microsoft.com/en-us/library/ms730064.aspx,然后将System.Diagnostics.XmlWriterTraceListener替换为实现该接口的自己的类。虽然我自己没有尝试过。 - Yaron Naveh
我最终做到了这一点 - 这是WCF不完整和痛苦的另一个例子。 - JohnOpincar
作为自定义消息编码器的示例,您可以参考我的项目 https://github.com/capslocky/WcfSoapLogger - Adam

2

1

我也找到了this

<system.diagnostics>
    <sources>
        <source name="System.ServiceModel.MessageLogging">
            <listeners>
                <add name="messages"
                type="System.Diagnostics.XmlWriterTraceListener"
                initializeData="c:\log\wcfMessages.svclog" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>

<system.serviceModel>
    <diagnostics>
        <messageLogging
                 logEntireMessage="true"
                 logMalformedMessages="true"
                 logMessagesAtServiceLevel="true"
                 logMessagesAtTransportLevel="true"
                 maxMessagesToLog="1000000"
                 maxSizeOfMessageToLog="10000000"/>
    </diagnostics>
</system.serviceModel>

这并不是理想的,因为您需要使用工具来查看消息,但它似乎可以捕获所有标头、故障等实际消息。


我尝试了这个解决方案,但它没有包括头文件。 - korvinko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接