2010-08-25 98 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