2

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

我有一个作为 Windows 服务托管的简单 WCF 服务。WCF 服务每天都会写入日志。有时会有不好的请求进来,我也想登录。

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

问候。

4

3 回答 3

3

我想添加到@RoelF 的回复,因为他在下面提到

虽然我不确定如何准确记录 SOAP 消息的内容,但这种方法可以为您提供很多额外的信息,尤其是在您实现定时记录的情况下。

因此,这是您用来从 AfterCall BeforeCall 方法中获取 SOAP 请求的行。

Message message = OperationContext.Current.RequestContext.RequestMessage;

然后你可以记录 message.ToString() 。这应该记录您之后的 SOAP 请求。

于 2018-02-19T06:51:22.090 回答
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 消息的内容,但这种方法可以为您提供很多额外的信息,尤其是在您实现定时记录的情况下。

于 2013-01-25T08:54:58.333 回答
1

您可以在服务的配置文件中配置跟踪和跟踪级别。为了查看日志文件,Microsoft 提供了一个特殊的跟踪日志查看器。通常,您只需双击跟踪文件即可在此查看器中打开它们。

这在SO上已经回答了很多次,例如How to turn on WCF tracking?

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>
于 2013-01-25T09:00:54.510 回答