我认为这很简单,但我看不出如何告诉WCF记录消息体。我有:
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Verbose">
<listeners>
<add type="System.Diagnostics.DefaultTraceListener" name="Default">
<filter type="" />
</add>
<add type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.EntLibLoggingProxyTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging"
name="traceListener">
<filter type="" />
</add>
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true"
logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" />
</diagnostics>
...etc..,
...etc...
</system.Model>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
<listeners>
<add fileName="_trace-xml.log"
listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.XmlTraceListenerData,Microsoft.Practices.EnterpriseLibrary.Logging"
traceOutputOptions="None"
type="Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners.XmlTraceListener,Microsoft.Practices.EnterpriseLibrary.Logging"
name="XML Trace Listener" />
...etc... other listeners
</listeners>
...etc...
</loggingConfiguration>
但我记录的只是关于消息的内容,而不是消息体。我需要更改为记录消息内容?
如果您需要邮件正文,则必须以编程方式自己捕获它们。使用服务行为安装消息检查器并捕获IDispatchMessageInspector或IClientMessageInspector实现中的消息。
只是按照这个描述对我来说非常适合:http://msdn.microsoft.com/en-us/library/ms730064.aspx
<system.diagnostics>
<sources>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="messages"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\messages.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="false"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="false"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="2000"/>
</diagnostics>
</system.serviceModel>
无需为此编写任何代码......
我发现了版本问题。当WCF服务项目是针对.Net 3.5构建的时,我在查看器工具中看到了完整的消息体。针对.Net 4.0构建,我没有看到任何消息体。
尝试使用http://www.csharptutorial.in/12/csharp-net-wcf-how-to-enable-wcf-tracing-and-messagelogging并设置logMessagesAtTransportLevel =“true”。在您的日志文件中,您可以找到<s:Body>
标签。调查他们附近的文字。稍后您可以添加新的“XmlListener”并以更灵活的格式找到邮件正文。
您可以考虑另一种方式来查看XML SOAP - custom MessageEncoder。与类似的IDispatchMessageInspector / IClientMessageInspector的主要区别在于它在较低级别上工作,因此它捕获原始字节内容,包括任何格式错误的xml。
为了使用这种方法实现跟踪,您需要将标准textMessageEncoding与custom message encoder包装为新的binding element,并将该自定义绑定应用于config中的端点。
你也可以看看我是如何在我的项目中做到的 - wrapping textMessageEncoding,记录encoder,自定义绑定element和config。