0

我们的应用程序调用外部服务,例如

//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 中的内置方法(如果有)?

4

3 回答 3

2

我首先要看的是服务器性能监视器中可用的计数器是否可以为您提供所需的反馈。为 ServiceModel 端点、操作和服务的各种指标内置了计数器。这是更多信息http://msdn.microsoft.com/en-us/library/ms735098.aspx

于 2013-04-09T03:43:19.470 回答
2

您可以尝试构建IClientMessageInspector的实现,它有一个在发送请求之前和收到回复时调用的方法。您可以在这些方法中检查消息、制作日志等。

您提供IEndpointBehavior的实现,它应用您的消息检查器,然后将端点行为添加到您的代理客户端实例。

client.Endpoint.Behaviors.Add(new MyEndpointBehavior())

查看 MessageInspectors 和 EndpointBehaviors 的文档,有许多不同的应用方式(属性、代码、端点 xml 配置),我不记得我的头顶适用于哪个,因为还有 IServiceBehavior 和 IContractBehavior。我确实知道端点行为可以添加到客户端代理集合中。

于 2013-04-09T06:21:19.443 回答
0

我找到了一种使用动态代理的简单方法,例如Castle 的 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 块来调用不同的处理程序,以防方法抛出异常等。

于 2013-04-22T02:18:19.370 回答