2010-08-25 97 views
0

我有一個wcf客戶端。wcf連接處理最佳做法

處理連接的最佳方式是什麼?

它是打開和關閉每次需要聯繫服務時間:

void doSomething(){ 
    MyService service = new MyService(); 
    //try 
    service.doThis(10); 
    ... 
    service.doThat(20); 
    service.Close() 
    // catch 
} 

或者我應該保持打開參考,並終止它並重新初始化如果發生連接錯誤:

class Myclass{ 
    MyService service = new MyService(); 
    ... 
    void myFunction(){ 
    try{ 
     service.doThis(10); 
    }catch(...){ 
     service.abort(); 
     service = new Myservice(); 
     // do something here, but what it a smart thing to to? 
    } 
    } 
} 

問候

回答

1

第一種方法很常見。第二種方法是完全錯誤的。對您的問題最重要的提示是:如果您關閉/中止代理,則不能再次使用它。它只打開一次。

如果您使用第一種方法,則每次創建新的代理並「打開」新的連接。這裏公開的對於不同的綁定和情況可以有不同的含義。撥打電話後,您優雅地關閉代理。這也會通知服務器關閉連接。

第二種方法使用類似的步驟,除了最後一個強制關閉連接。這不會通知服務器關閉連接。但是您將無法在服務器上重新使用未關閉的連接。

如果要重新使用代理,必須將其打開。你必須在服務器上使用超時處理一些其他的複雜性(receiveTimeout - 默認情況下連接在10分鐘不活動後關閉)和未處理的異常。如果您有基於會話的連接或服務,每個未處理的異常都會使通信通道出現故障,您將只能在通道上調用Abort。

+0

如果第一種方法很常見,是否每次開銷都會造成開銷,或者開銷可以忽略不計? – darpet 2010-08-25 10:20:35

+0

這取決於您正在構建的應用程序類型以及呼叫頻率。 – 2010-08-25 10:30:59

+0

每5-6秒一個呼叫,200個客戶端在並列 – darpet 2010-08-25 10:44:38