使用 IDispatchMessageInspector 进行 WCF 服务日志记录

yog*_*ogi 1 c# wcf logging idispatchmessageinspector

我正在尝试记录来自 WCF 服务的请求和响应。到目前为止我所做的是:

public class OutputMessageInspector : IDispatchMessageInspector
{
    int lastLogId;

   public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
   {
       // Parse request & read required information
       // Insert request data into log tables
       // Set lastLogId to the id created above
   }

   public void BeforeSendReply(ref Message reply, object correlationState)
   {
       // Parse reply
       // Using lastLogId update the response column in database table
   }
}
Run Code Online (Sandbox Code Playgroud)

一切正常,但我有一个担忧:

AfterReceiveRequest并且BeforeSendReply必须同步工作,以便BeforeSendReply更新正确的记录。我想到的情况是服务同时从多个客户端调用,问题:

  • 不会lastLogId在多个请求和响应之间混乱和混乱吗?
  • 此日志记录特别更新是否BeforeSendReply可以在多个客户端同时调用服务的情况下正常工作?如果是,请给我一个解释,以确保我的想法;如果否,请提供更好的解决方案。

Ern*_*ieL 5

我同意 @Schneiders 解决方案,使用 WCF 日志记录来满足您的要求。

不过回答你的问题:

此日志记录在 BeforeSendReply 处专门更新是否可以在多个客户端同时调用服务的情况下正常工作?

不,不会。的实例IDispatchMessageInspector在调用之间共享。

correlationState不使用成员属性,而是通过on支持调用特定数据IDispatchMessageInspector。无论返回什么对象都AfterReceiveRequest()将作为correlationStateto传递BeforeSendReply()

换句话说,这样的事情应该有效:

public class OutputMessageInspector : IDispatchMessageInspector
{
   public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
   {
       // Parse request & read required information
       // Insert request data into log tables
       // Set lastLogId to the id created above
       return lastLogId
   }

   public void BeforeSendReply(ref Message reply, object correlationState)
   {
       // Parse reply
       int lastLogId = (int)correlationState;
   }
}
Run Code Online (Sandbox Code Playgroud)