0

我正在尝试记录来自我的 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
   }
}

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

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

  • 不会lastLogId在多个请求和响应之间搞砸和洗牌吗?
  • 此日志记录特别更新BeforeSendReply会与多个客户端同时调用服务正常工作吗?如果是,那么请给我一个解释,以确保我的想法,如果不是,那么请为此提供更好的解决方案。
4

2 回答 2

4

我同意 @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;
   }
}
于 2014-09-12T15:01:06.920 回答
1

首先:WCF 具有记录请求和响应的内置功能,因此在推出自己的解决方案之前可能值得研究一下。

至于您的问题,通常您将 IDispatchMessageInspector 应用为服务或端点行为,挂钩 ApplyDispatchBehavior。在那里,您可能正在创建一个新的 OutputMessageInspector 并将其添加到 DispatchRuntime.MessageInspectors 集合中。

行为仅在创建服务或端点时应用一次,因此您可以从中推断只有一个 DispatchRuntime 并且您只创建一个 MessageInspector ,因此它将在所有请求/线程之间共享。

在这种情况下,您的 OutputMessageInspector 需要是“线程安全的”。如果你在那里保持状态,你将需要同步对它的访问,这样它就不会被打乱。

于 2014-09-12T11:18:12.280 回答