我们的应用程序调用外部服务,如
//in client factory
FooServiceClient client = new FooServiceClient(binding, endpointAddress);
//in application code
client.BarMethod(); //or other methods
是否可以跟踪所有这些呼叫(例如通过事件或类似事件),以便应用程序可以收集诸如呼叫次数,响应时间等统计信息?请注意,我的应用程序本身需要访问这些值,而不仅仅是写入日志文件。
我能想到的是创建VisualStudio生成的FooServiceClient的子类,然后添加这样的代码
override void BarMethod()
{
RaiseStart("BarMethod");
base.BarMethod();
RaiseEnd("BarMethod);
}
并且RaiseStart和RaiseEnd方法将引发将由我的代码监听的事件。
但这看起来很乏味(因为有很多方法需要覆盖)并且有很多重复的代码,我的代码需要在服务合同每次更改时更改等等。有没有更简单的方法来实现这一点,因为例如,通过使用反射创建子类或通过在WCF中使用内置方法,如果有的话?
答案 0 :(得分:2)
我要看的第一件事是查看服务器性能监视器中可用的计数器是否可以为您提供所需的反馈。有针对ServiceModel端点,操作和服务的各种指标的内置计数器。这是一些更多信息http://msdn.microsoft.com/en-us/library/ms735098.aspx
答案 1 :(得分:2)
您可以尝试构建IClientMessageInspector的实现,该实现具有在发送请求之前和收到回复之前调用的方法。您可以在这些方法中检查消息,制作日志等。
您提供了IEndpointBehavior的实现,它将应用您的消息检查器,然后将端点行为添加到您的代理客户端实例。
client.Endpoint.Behaviors.Add(new MyEndpointBehavior())
查看MessageInspectors和EndpointBehaviors的文档,有很多不同的应用方法(属性,代码,端点xml配置),我不记得我的头顶哪个适用于哪个,因为还有IServiceBehavior和IContractBehavior。我确实知道端点行为可以添加到客户端代理集合中。
答案 2 :(得分:0)
我找到了一种使用动态代理的简单方法,例如Castle's Dynamic Proxy。
首先,使用工厂方法生成客户端对象
IFooClient GetClient()
{
FooClient client = new FooClient(); //or new FooClient(binding, endpointAddress); if you want
ProxyGenerator pg = new ProxyGenerator();
return pg.CreateInterfaceProxyWithTarget<IFoo>(client, new WcfCallInterceptor());
}
定义拦截器
internal class WcfCallInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
try
{
RaiseStart(invocation.Method.Name);
invocation.Proceed();
}
finally
{
RaiseEnd(invocation.Method.Name);
}
}
//you can define your implementation for RaiseStart and RaiseEnd
}
我也可以按照自己的意愿更改拦截方法,例如我可以添加一个catch块来调用不同的处理程序,以防方法抛出异常,等等。