2010-03-27 113 views
1

我正在開發一個WPF應用程序,通過互聯網通過WCF服務與服務器通信。在分析應用程序之後,我注意到通過創建適當的WCF客戶端代理並調用服務器,正在佔用大量時間。WCF性能改進

服務器上的代碼已經過優化,並且不需要任何時間運行我仍然看到從服務啓動到返回客戶端時的延遲1.5秒。

有幾點給一點背景知識:

  • 我使用ASP.Net會員安全
  • 我最終將通過一個網站掛接到同一個服務器端代碼
  • 我最終會喜歡在應用程序中有離線支持

我真的需要儘早指出性能,儘管應用程序需要幾秒鐘才能回來它太離譜了克爲我正在嘗試做什麼。

任何人都可以提出性能提示,這將幫助我嗎?

+2

您確定這些延遲不是由於網絡延遲造成的嗎?嘗試從收到請求的那一刻開始分析服務,並在發送響應的那一刻進行分析。這可以通過實現一個自定義的'IDispatchMessageInspector'完成:http://weblogs.asp.net/paolopia/archive/2007/08/23/writing-a-wcf-message-inspector.aspx – 2010-03-27 19:01:18

+0

@Darin - 它可以'不要因爲我在開發環境中的本地主機上,我仍然會嘗試你的建議。 有沒有其他想法? – Burt 2010-03-27 20:49:59

+0

如果這個1.5s沒有在服務和網絡延遲中消耗,剩下的就是客戶端應用程序。 – 2010-03-27 21:02:57

回答

1

WCF中的客戶端代理基本上由兩部分組成。如果您控制通信的兩端 - 例如 - 如果你寫的服務器和客戶端您可以通過以下步驟優化這個:

  • 隔離所有服務和數據合同到自己單獨的程序
  • 引用,大會在服務器端(實現您服務),以及客戶端

這樣做,你不需要使用Add Service Reference創建一個「通用」客戶端代理,而是,你可以拆解該進程進入兩個單獨的步驟:

  • 第一步是使用您的服務合同創建ChannelFactory<T>,例如,

    ChannelFactory<IMyService> factory = new ChannelFactory<IMyService>(); 
    

    因爲你需要訪問在客戶端的服務合同,則需要將這些合同進行分成自己組裝,這樣你可以參考在客戶端相同的合同。創建渠道工廠是一個昂貴的部分 - 你想掛在那個渠道工廠,並把它放到一個共享的,緩存的各種容器(你的主窗體或其他東西)中。

  • 所述第二步驟是從通道工廠創建實際的信道(「代理」):

    IMyService proxy = factory.CreateChannel(); 
    

    該操作要少得多的資源密集的,並且可以每個服務調用和不應該」之前進行不會浪費大量時間。

因此,通過幾個基本步驟,您應該能夠顯着簡化並加快構建服務客戶端代理。

+1

您實際上不需要在客戶端引用服務合約程序集。您可以使用'svcutil.exe'生成代理並執行前面的步驟來調用服務。 – 2010-03-28 06:27:11