WCF 服务代理 - 调用 Close() 和 Abort 函数

Posted

技术标签:

【中文标题】WCF 服务代理 - 调用 Close() 和 Abort 函数【英文标题】:WCF Service proxy - Both Close() and Abort functions getting called 【发布时间】:2016-08-30 20:01:23 【问题描述】:

我有以下代码来调用 WCF 代理:-

var client = new ServiceClientProxy(); 

try
 

   var documents = client.GetDocuments();
   client.Close();

   if(documents.Length > 50)
   
     throw new Exception("Too many Documents");
   

  else if(documents.Length <10)
   
     throw new Exception("Too many Documents");
   

  else
   
     return documents;
   

 

catch(exception ex)

  client.Abort();

这里如果我们从服务中获得的文档数量超过 50 或少于 10,在这种情况下,我们将同时调用 Close() 以及客户端上的 Abort 函数。这是调用 WCF 服务的预期方式吗代理? 任何人都请建议是否有更好的方法来处理这个问题。

在调用后立即关闭客户端连接是更好的方法,还是我们需要等到我们完全使用响应属性并在结束时关闭连接?

【问题讨论】:

这篇文章可能对你有所帮助。 relentlessdevelopment.wordpress.com/2010/01/17/… 你能修正缩进吗? 感谢 vercin。链接中的文章有关于如何关闭 wcf 的信息。但我的问题是,如果代码本身抛出异常,那么在关闭函数后会调用中止函数。是否这会导致什么问题吗? 【参考方案1】:

这也是关闭客户端连接的更好方法吗 通话后立即还是我们需要等到我们有 完全使用响应属性并关闭连接 结束了吗?

取决于您是否需要对服务进行后续调用。如果没有,那么请关闭连接。

这是调用 WCF 服务代理的预期方式吗?请任何人 建议是否有更好的方法来处理这个问题。

没有。要处理嵌入到 WCF 中的问题,您实际上应该采用如下结构:

  Documents documnts = null;

     try
     
          var client = new ServiceClientProxy();
          documents = client.GetDocuments();
     
     finally
     
         try
         
            if (client.State != CommunicationState.Closed)
                 client.Close();
          
          catch
          
             client.Abort();
          ;
    ;

    if (documents.Length > 50)
    
        throw new Exception("Too many Documents");
    
    else if (documents.Length < 10)
    
        throw new Exception("Too many Documents");
    
    else
    
       return documents;
    

如果您想真正了解“为什么”,我强烈建议您阅读本系列文章。他们将清除您问题的关闭/中止部分。

http://blogs.msmvps.com/p3net/2014/02/02/a-smarter-wcf-service-client-part-1/
http://blogs.msmvps.com/p3net/2014/02/09/a-smarter-wcf-service-client-part-2/
http://blogs.msmvps.com/p3net/2014/02/23/a-smarter-wcf-service-client-part-3/
http://blogs.msmvps.com/p3net/2014/03/15/a-smarter-wcf-service-client-part-4/

我应该在您提供的代码中指出的另一件事是异常应该是异常的。

在我认为是业务逻辑的情况下使用异常通常不是正确的做法。请考虑返回结构化结果的方法。也许在你的情况下它是有道理的。

HTH

【讨论】:

非常感谢斯蒂芬。我还有一个疑问。如果我们先在一个客户端上调用 close 然后在同一个客户端上调用 abort,我们会得到任何异常或错误吗? 你有运行代码,所以我认为没有什么能阻止你尝试它。

以上是关于WCF 服务代理 - 调用 Close() 和 Abort 函数的主要内容,如果未能解决你的问题,请参考以下文章

在 Mono Mac 上调用 WCF 客户端通道上的 Close() 超时,但在 Windows 上有效

关闭 WCF 连接

WCF 客户端代理初始化

为 Rest Web 服务创建 WCF 代理

WCF引用服务和直接用接口的区别

WCF通信