有没有办法将传入请求记录到WCF服务?
我有一个托管为Windows服务的简单WCF服务。 WCF服务每天写入日志。 有时会出现一个糟糕的请求,我也想记录下来。
有没有办法记录进来的SOAP请求? 这样,它将有助于向客户展示他们正在犯的错误。
问候。
答案 0 :(得分:2)
您可以尝试实现一个IServiceBehavior
和一个IParameterInspector
类,它将处理日志记录。
<强> IServiceBehavior接口强>
ApplyDispatchBehavior
是最重要的实施方法:
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
foreach (var endpoint in dispatcher.Endpoints)
{
foreach (var dispatchOperation in endpoint.DispatchRuntime.Operations)
{
dispatchOperation.ParameterInspectors.Add(new LoggingParameterInspector(/*reference to your logger*/));
}
}
}
}
您必须将此ServiceBehavior
应用于您的服务,方法是将其设置为服务实现类的Attribute
,或者在启动时将其添加到定义中。
<强> IParameterInspector 强>
此界面有两种方法:BeforeCall
和AfterCall
。在这些方法的实现中,您可以访问操作名称和给予方法的输入。这使您可以创建对服务的所有调用的简洁跟踪。
虽然我不确定如何准确记录SOAP消息的内容,但此方法可以为您提供大量额外信息,特别是如果您实施定时日志记录。
答案 1 :(得分:2)
我想加入@RoelF的回应,因为他提到了以下
虽然我不确定如何准确记录SOAP的内容 消息,这种方法可以为您提供大量额外信息, 特别是如果你实施定时记录。
所以这是您用来从AfterCall BeforeCall方法获取SOAP请求的行。
Message message = OperationContext.Current.RequestContext.RequestMessage;
然后你可以记录message.ToString()。这应该记录您所追求的SOAP请求。
答案 2 :(得分:1)
您可以在服务的配置文件中配置跟踪和跟踪级别。为了查看日志文件,Microsoft提供了一个特殊的跟踪日志查看器。通常,您只需双击跟踪文件即可在此查看器中打开它们。
这已在SO上多次回答,例如How to turn on WCF tracing?
MSDN上的文档 http://msdn.microsoft.com/en-us/library/ms733025.aspx
示例配置
<configuration>
<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>
<source name="myUserTraceSource"
switchValue="Information, ActivityTracing">
<listeners>
<add name="xml"/>
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="Error.svclog" />
</sharedListeners>
</system.diagnostics>
</configuration>