C# - WCF消息检查器不运行

时间:2017-06-07 22:11:18

标签: c# .net wcf generics

我正在重构一个包含大约5种不同Web服务的项目,每个Web服务都有大量相同的代码,包括在客户端端点行为上添加消息检查器,以便我们可以看到请求和响应数据。

部分重构是为Web服务提供一个更清晰的模型(例如,一个抽象的基本服务模型,它完成了所有常见的设置,包括添加了消息检查器)。

现在,当我进行服务调用(通过反射调用)时,服务调用完全正常,如果我在响应返回后立即添加断点,我可以看到有3个行为添加到客户端&# 39; s端点:

[0] Microsoft.VisualStudio.Diagnostics.ServiceModelSink.Behavior
[1] System.ServiceModel.Description.ClientCredentials
[2] MyProject.MyMessageInspector

...但是消息检查器代码似乎根本不再被调用。检查器代码当前与此处的MSDN示例相同(类名除外): https://msdn.microsoft.com/en-us/library/ms733786(v=vs.110).aspx

主要区别在于我现在使用通用方法设置客户端,如下所示:

...sanity checks, etc...
TClient client = Activator.CreateInstance(typeof(TClient), binding, new EndpointAddress(url)) as TClient;
ClientBase<TInterface> _clientBase = client as ClientBase<TInterface>;
...credentials, timeout, etc...
MyEndpointBehavior _inspector = new MyEndpointBehavior()
_clientBase.Endpoint.Behaviors.Add(_inspector);

然后,当我进行调用时,我使用位于新抽象基类中的代码(原始代码以这种方式执行,到目前为止唯一的区别是使用泛型):

ClientBase<TInterface> _clientBase = _client as ClientBase<TInterface>;
using (new OperationContextScope(_clientBase.InnerChannel))
{
  // Get the method
  MethodInfo mi = _client.GetType().GetMethod(APICall);

  // Make the call and return the result if successful
  object response = mi.Invoke(_client, APICallParameters);
  return response;
}

为什么在切换到通用方法之前有效的原因而不是现在呢?

1 个答案:

答案 0 :(得分:0)

我不确定为什么会有所不同,但是我重新命令代码在客户端创建后立即移动检查器,所以代码现在看起来像这样:

...sanity checks, etc...
TClient client = Activator.CreateInstance(typeof(TClient), binding, new 
EndpointAddress(url)) as TClient;
ClientBase<TInterface> _clientBase = client as ClientBase<TInterface>;
MyEndpointBehavior _inspector = new MyEndpointBehavior()
_clientBase.Endpoint.Behaviors.Add(_inspector);
...credentials, timeout, etc...

检查员现在似乎按预期工作了。奇怪。