记录WCF服务收到的请求

时间:2013-01-25 08:44:13

标签: wcf logging soap

有没有办法将传入请求记录到WCF服务?

我有一个托管为Windows服务的简单WCF服务。 WCF服务每天写入日志。 有时会出现一个糟糕的请求,我也想记录下来。

有没有办法记录进来的SOAP请求? 这样,它将有助于向客户展示他们正在犯的错误。

问候。

3 个答案:

答案 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
此界面有两种方法:BeforeCallAfterCall。在这些方法的实现中,您可以访问操作名称和给予方法的输入。这使您可以创建对服务的所有调用的简洁跟踪。

虽然我不确定如何准确记录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>