2014-02-19 66 views
0

我一直了解到,从未使用使用调用WCF服务这样最佳实践来调用WCF服务

using (Service.YourClientProxy client = new Service.YourClientProxy()) 
{ 
    var time = client.Time(); 
} 

所以我总是用这个来调用服务

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 
声明

我一直在阅读我的计算器,我已阅读此文章here Service.cs类取自stackoverflow

我想知道这是否是一个很好的习惯来调用WCF服务,这是否真的关闭了服务?

public static class Service<TChannel> 
{ 
    public static ChannelFactory<TChannel> ChannelFactory = new ChannelFactory<TChannel>("*"); 

    public static TReturn Use<TReturn>(Func<TChannel, TReturn> codeBlock) 
    { 
     var proxy = (IClientChannel)ChannelFactory.CreateChannel(); 
     var success = false; 
     try 
     { 
      var result = codeBlock((TChannel)proxy); 
      proxy.Close(); 
      success = true; 
      return result; 
     } 
     finally 
     { 
      if (!success) 
      { 
       proxy.Abort(); 
      } 
     } 
    } 
} 

从这样的客户端调用服务。

 var time = Service<Service.YourServiceChannel>.Use(resultAsync => 
     { 
      return resultAsync.TimeAsync(); 
     }); 
+0

我做了一个参考,并阅读了这篇文章,但我不清楚最佳做法。我也在问,我提到的代码示例是否确实关闭了连接。 – user3046164

回答

3

从这篇文章:

http://msdn.microsoft.com/en-us/library/aa355056(v=vs.110).aspx

这似乎是最好的做法是调用Dispose是通过调用try块关闭:

try 
{ 
    client.Close(); 
} 
catch (CommunicationException e) 
{ 
    client.Abort(); 
} 
catch (TimeoutException e) 
{ 
    client.Abort(); 
} 
catch (Exception e) 
{ 
    client.Abort(); 
    throw; 
} 

您还可以添加记录或者每个catch块中的其他内容。

+0

-1:你的'Dispose'在哪里?这个问题是重复的。 –

+0

不调用Close()与调用Dispose()在这里相同吗? –

+0

非常多,在这种情况下,您的答案应该是“Close”,而不是“Dispose”。 –