【问题标题】:WCF Service proxy - Both Close() and Abort functions getting calledWCF 服务代理 - 调用 Close() 和 Abort 函数
【发布时间】: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 的信息。但我的问题是,如果代码本身抛出异常,那么在关闭函数后会调用中止函数。是否这会导致什么问题吗?

标签: wcf wcf-data-services wcf-binding wcf-security wcf-rest


【解决方案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,我们会得到任何异常或错误吗?
  • 你有运行代码,所以我认为没有什么能阻止你尝试它。
猜你喜欢
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多