我有一个wcf网络服务。我在db上记录错误。我的错误日志表包含ErrorMessage,Date,LogLevel等字段。我还需要记录soap消息。如何在服务中捕获响应并请求soap消息?
编辑:我正在使用log4net库进行日志记录。
答案 0 :(得分:1)
如果您想“捕获”并在WCF服务的“最外层”边缘记录应用程序消息,那么您应该考虑实现IDispatchMessageInspector
,这将启用对入站/出站服务消息的自定义检查。
以下MSDN链接提供了IDispatchMessageInspector
的概述,它引用了您的方案:
实施IDispatchMessageInspector以检查或修改入站或 在分派请求之前出站应用程序消息 消息到操作或在将回复消息返回给a之前 呼叫者。有许多场景需要 在调用它所针对的操作之前拦截消息 注定。例如,您可以记录传入的应用程序消息或 根据邮件标题执行某些功能。
或者,您可以考虑将WCF跟踪日志记录与自定义数据库跟踪侦听器结合使用。通过这种方式,WCF将跟踪数据提供给自定义侦听器,该侦听器可以插入到数据库中。
http://msdn.microsoft.com/en-us/library/ms733025(v=vs.110).aspx
答案 1 :(得分:1)
为了以可靠的方式拦截所有请求和响应,您必须实施BehaviorExtensionElement
我已经回答了如何在此thread
你所能做的就是这样的事情
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
//here you can create a buffered message as the original message can accessed only once
//MemoryStream stream = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = System.Text.Encoding.UTF8;
StringWriter sw = new StringWriter();
XmlWriter writer = XmlWriter.Create(sw, settings);
MessageBuffer buffer = request.CreateBufferedCopy(int.MaxValue);
//Create a copy of the message in order to continue the handling of te SOAP
request = buffer.CreateMessage();
request.WriteMessage(writer);
//Recreate the message
writer.Flush();
//Flush the contents of the writer so that the stream gets updated
//you can log the str to the database
var str = sw.ToString();
request = buffer.CreateMessage();
}
答案 2 :(得分:0)
我很确定你必须通过创建自己的使用log4net管理器的监听器来组合ASP.NET系统诊断组件和log4net。
在您的网络配置中,查看<system.diagnostics>
部分和<sharedListeners>
。在我的情况下,我们将完整的请求/响应记录到文件中。
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="d:\soap.svclog" />
</sharedListeners>
</system.diagnostics>