2012-11-08 33 views
0

我身邊有一個WCF服務APIWCF:保持客戶活着和時間來關閉它

Class APIWrapper 
{ 
    private WCFClient _client; 
    //constructor opens a client connection 
    public APIWrapper() 
    { 
     _client = new WCFClient(); 
     _client.open(); 
    } 

    public API1() 
    { 
     _client.doSomething1(); 
    } 

    public API2() 
    { 
     _client.doSomething2(); 
    } 

} 

我想問一個包裝:

Q1將超時異常發生的?如果這個包裝類實例存在太久了? (默認的WCF連接保持活動狀態嗎?沒有在配置中設置該屬性)例如,在構造包裝類之後,其API1或API2將在10分鐘後調用,該時間比此WCF連接的超時值更長。

Q2我是否需要顯式關閉連接,如果是這樣,我應該在下面的包裝類的析構函數中執行它嗎?

~APIWrapper 
{ 
    if(_client !=null) 
    try{ 
     _client.close(); } 
    catch(Exception e){ 
     _client.Abort(); } 
} 

回答

4

我不知道爲什麼你想這樣做,但如果WCF是在IIS7主辦的WCF將有或無連接的開始,沒有點保持連接活着。

根據我的經驗,這些服務在無狀態時效果最好(除非你有很好的理由)。我強烈建議每次打開和關閉連接。如果你是爲了表現而這樣做的話,還有其他方法可以避免每次關閉和打開。

Q1:根據MSDN的openTimeout爲1分鐘

http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.binding.opentimeout.aspx

Q2:你並不需要顯式地關閉連接,但它是一個很好的做法,我強烈建議這樣做。不關閉連接可能會導致WCF的開銷。

+0

關於Q1,Taner是對的,你應該檢查「inactivityTimeout」 – Jordi

+0

謝謝。因此對於Q2,最好有一個析構函數來釋放連接 –

+0

是的,總是釋放資源。 WCF可能以很多未使用的打開的連接結束,導致性能問題。 – Jordi

1

據我所知,WCF不會保持連接活着。經過預定義的時間(inactivityTimeout =「00:10:00」)後,當您嘗試調用_client.doSomething1()或該服務上的任何其他方法時,連接將引發異常。

WCF inactivity timeout

要保持連接,你應該在預定的時間間隔調用一個簡單的方法,可以說,每1分鐘。

但是,我同意Jordi關於您應該使用wcf服務無狀態,直到它是真正必要的。

+0

謝謝。我認爲10分鐘就足夠了。這個包裝類不會持續更長的時間。這些API即使在包裝類中也是無狀態的,這只是爲了節省手動打開和關閉WCF連接的麻煩。 –