代码之家  ›  专栏  ›  技术社区  ›  darpet

WCF连接处理最佳实践

  •  0
  • darpet  · 技术社区  · 14 年前

    我有一个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 回复  |  直到 14 年前
        1
  •  1
  •   Ladislav Mrnka    14 年前

    第一种方法很常见。第二种方法是完全错误的。对于您的问题,最重要的提示是:如果关闭/中止代理,就不能再使用它。它只打开一次。

    如果使用第一种方法,则每次都创建新的代理,并“打开”新的连接。这里的open对于不同的绑定和情况有不同的含义。打完电话后,请优雅地关闭代理。这还将通知服务器有关关闭连接的信息。

    第二种方法使用类似的步骤,除了最后一个强制关闭连接的步骤。这不会通知服务器有关连接关闭的信息。但您将无法在服务器上重用未关闭的连接。

    如果要重用代理,必须将其保持打开状态。此外,您还必须处理服务器上超时(receiveTimeout-默认情况下,连接在10分钟不活动后关闭)和未处理的异常的一些其他复杂性。如果您有基于会话的连接或服务,每个未处理的异常都将使通信通道出现故障,并且您只能在通道上调用abort。