【问题标题】:Logging the request received by a WCF service记录 WCF 服务收到的请求
【发布时间】:2013-01-09 04:56:06
【问题描述】:

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

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

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

问候。

【问题讨论】:

    标签: wcf logging soap


    【解决方案1】:

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

    虽然我不确定如何准确记录 SOAP 的内容 消息,这种方法可以为您提供很多额外的信息, 特别是如果您实现了定时日志记录。

    下面是您用来从 AfterCall BeforeCall 方法中获取 SOAP 请求的行。

    Message message = OperationContext.Current.RequestContext.RequestMessage;
    

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

    【讨论】:

      【解决方案2】:

      您可以尝试实现 IServiceBehaviorIParameterInspector 类,它们将处理日志记录。

      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 消息的内容,但这种方法可以为您提供很多额外的信息,特别是如果您实现了定时记录。

      【讨论】:

        【解决方案3】:

        您可以在服务的配置文件中配置跟踪和跟踪级别。为了查看日志文件,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>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多