【发布时间】:2013-01-09 04:56:06
【问题描述】:
有没有办法将传入请求记录到 WCF 服务?
我有一个作为 Windows 服务托管的简单 WCF 服务。 WCF 服务每天都会写入日志。 有时会有错误的请求进来,我也想登录。
有没有办法记录进来的 SOAP 请求? 这样有助于向客户展示他们所犯的错误。
问候。
【问题讨论】:
有没有办法将传入请求记录到 WCF 服务?
我有一个作为 Windows 服务托管的简单 WCF 服务。 WCF 服务每天都会写入日志。 有时会有错误的请求进来,我也想登录。
有没有办法记录进来的 SOAP 请求? 这样有助于向客户展示他们所犯的错误。
问候。
【问题讨论】:
我想补充@RoelF 的回复,因为他在下面提到
虽然我不确定如何准确记录 SOAP 的内容 消息,这种方法可以为您提供很多额外的信息, 特别是如果您实现了定时日志记录。
下面是您用来从 AfterCall BeforeCall 方法中获取 SOAP 请求的行。
Message message = OperationContext.Current.RequestContext.RequestMessage;
然后你可以记录 message.ToString() 。这应该记录您所追求的 SOAP 请求。
【讨论】:
您可以尝试实现 IServiceBehavior 和 IParameterInspector 类,它们将处理日志记录。
IServiceBehaviorApplyDispatchBehavior 是最重要的实现方法:
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 消息的内容,但这种方法可以为您提供很多额外的信息,特别是如果您实现了定时记录。
【讨论】:
您可以在服务的配置文件中配置跟踪和跟踪级别。为了查看日志文件,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>
【讨论】: