2010-08-31 45 views
2

我有一個ASP.net頁面創建一個WCF服務的服務引用,並在我的頁面的多個地方撥打電話。我實例在Page_Load中的服務引用,並有一個實例變量來存儲它:ASP.net頁面中的WCF服務參考 - 何時處理?

private FooClient _serviceClient; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    _serviceClient = nwe FooClient(); 
    _serviceClient.GetAllFoos(); 
} 

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    _serviceClient.SaveFoo(); 
} 

我才發現,原來我需要配置服務引用的時候,我用它做,否則連接將被保持活並且如果達到最大連接數將阻止傳入連接。處理這些參考文獻的最佳地點在哪裏?我正在考慮在OnUnLoad事件上做這件事。

有沒有更好的方法來做到這一點?

回答

0

根據MSDN文檔和個人經驗做一些事情如下:

try 
{ 
    ... 
    client.Close(); 
} 
catch (CommunicationException e) 
{ 
    ... 
    client.Abort(); 
} 
catch (TimeoutException e) 
{ 
    ... 
    client.Abort(); 
} 
catch (Exception e) 
{ 
    ... 
    client.Abort(); 
    throw; 
} 

這將允許服務的正確關閉或流產必要的時候,而不是讓他們在預定的時間進行配置 - 只保留連接打開,只要你肯定不得不。個人而言,我不喜歡在性能自IDisposable繼承其非常重

+0

爲什麼繼承'IDisposable'性能很重? – 2010-08-31 17:13:38

+0

所以你建議我在每種需要訪問數據的方法中打開一個頻道?這在表現上似乎相當重要。 – Dismissile 2010-08-31 17:17:18

+0

@Dismissile - 爲什麼打開連接而不是在需要時打開它?如果數據庫沒有被使用,你會保持與數據庫的連接嗎?當然,目標是在可能的情況下保持連接免費使用,因此只在必要時纔打開.WCF服務可以在Dispose()上拋出異常,因此垃圾收集器將不得不清理連接。如果代碼看起來很難看,那麼確保它可以被重新考慮以保持代碼DRY – stack72 2010-08-31 20:33:45

1

就個人而言,我會在Page_Load但在做Web服務調用的方法打開FooClient當我需要它,所以。這樣,你確切知道它會發生什麼。我通常採取如下方法:

var client = OpenClient(); 
try 
{ 
    // Perform operation(s) on client. 
} 
finally 
{ 
    CloseClient(client); 
} 

這樣,你確信你關閉你的代理,無論發生什麼事(如果有需要捕捉異常,只需添加一個catch子句)。 CloseClient方法應該看起來像PaulStack的答案。

當你這樣做的另一個好處是,多次通話不會互相干擾。假設您的其中一個Web服務調用導致意外的異常。客戶端通道現在處於故障狀態,因此不能用於其他任何呼叫。

第三,假設發生了一個你不能捕捉或不想捕捉的異常,我不確定Page_Unload是否實際被調用(並且我不知道在那個事件中將調用哪個頁面方法) 。這也將使連接打開。