Как регистрировать содержимое сообщения WCF?
![enter image description here]()
Я думал, что это будет просто, но я не могу понять, как сообщить 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>
Но все, что я регистрирую, - это сообщение о сообщении, а не тело сообщения. Что мне нужно для изменения содержимого журнала сообщений?
Ответы
Ответ 1
Если вам нужны тела сообщений, вам придется записывать их самостоятельно, программно. Используйте поведение службы, чтобы установить инспектор сообщений и захватить сообщения внутри вашей реализации IDispatchMessageInspector или IClientMessageInspector.
Ответ 2
Только после этого описания отлично работает для меня: 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>
Не нужно писать код для этого...
Ответ 3
Я нашел проблему с версией. Когда проект службы WCF был создан против .Net 3.5, я увидел полный текст сообщения в средстве просмотра. Построено против .Net 4.0 Я не видел тела сообщения.
Ответ 4
Попробуйте http://www.csharptutorial.in/12/csharp-net-wcf-how-to-enable-wcf-tracing-and-messagelogging и настройте logMessagesAtTransportLevel = "true". В вашем файле журнала вы можете найти теги <s:Body>
. Расследуйте текст рядом с ними. Позже вы можете добавить новый "XmlListener" и найти тело сообщения в более гибком формате.