2013-04-09 67 views
0

我們的應用程序調用外部服務,如是否有可能跟蹤所有傳出的WCF呼叫?

//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

我找到了一個簡單的方法來使用動態代理來做到這一點,例如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塊來調用不同的處理程序,以防該方法拋出異常,等等。

2

你可以嘗試構建一個IClientMessageInspector的實現,該實現有一個在發送請求和收到回覆之前調用的方法。您可以在這些方法中檢查消息,創建日誌等。

您提供了應用您的消息檢查器的IEndpointBehavior的實現,然後將端點行爲添加到您的代理客戶端實例。

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

檢查出MessageInspectors和EndpointBehaviors的文檔,還有應用它們(屬性碼,端點XML配置)的許多不同的方式,我不記得我的頭頂部,其適用的,因爲那裏還有IServiceBehavior和IContractBehavior。但我確實知道端點行爲可以添加到客戶端代理集合中。

+0

cool ..但似乎用IClientMessageInspector我們不能得到任何東西,如果消息超時,例如由於無法訪問服務器。你知道如何也觀察這種錯誤發生的時間嗎? – 2013-04-16 06:55:05

+0

我不確定是否誠實,如果調用操作時服務器上有任何錯誤,客戶端會收到答覆,並且您可以在IClientMessageInspector.AfterReceiveReply中捕獲它們,因爲消息的IsFault屬性爲true。如果客戶端無法訪問服務器,我不確定您是否仍會收到錯誤的回覆。 – Matt 2013-04-16 23:11:11

相關問題