2012-06-15 130 views
2

2小零件对这个问题哪希望能澄清一些模糊的我。WCF呼叫 - 最佳实践

首先,这是调用WCF服务的更好吗?

using (var myService = new ServiceClient("httpBinding")){ 
    try{   
      var customerDetails = GetCustomerDetails(); 
      var results = myService.GetCustomerPurchases(customerDetails); 
    }catch(Exception e){ 
      ...... 
    } 
} 

var myService = new ServiceClient("httpBinding"); 
try{ 
    var customerDetails = GetCustomerDetails(); 
    var results = myService.GetCustomerPurchases(customerDetails); 
}catch(Exception e){ 
    ....... 
} 

我想知道是,我就应该总是缠绕我的服务呼叫在使用块?是否IDisposable.Dispose()获取如果服务抛出一个异常,叫什么名字?

回答

4

看看this的问题。你

还可以创建几个类像

public class ClientService<TProxy> 
{ 
    private static ChannelFactory<TProxy> channelFactory = new ChannelFactory<TProxy>("*"); 

    public static void SendData(Action<TProxy> codeBlock) 
    { 
     var proxy = (IClientChannel) channelFactory.CreateChannel(); 
     bool success = false; 

     try 
     { 
      codeBlock((TProxy)proxy); 
      proxy.Close(); 
      success = true; 
     } 
     finally 
     { 
      if (!success) 
      { 
       proxy.Abort(); 
      } 
     } 
    } 

    public static TResult GetData<TResult>(Func<TProxy, TResult> codeBlock) 
    { 
     var proxy = (IClientChannel) channelFactory.CreateChannel(); 
     bool success = false; 

     TResult result; 
     try 
     { 
      result = codeBlock((TProxy)proxy); 
      proxy.Close(); 
      success = true; 
     } 
     finally 
     { 
      if (!success) 
      { 
       proxy.Abort(); 
      } 
     } 

     return result; 
    } 
} 

public class SomeAnotherService<TProxy> 
{ 
    public static bool SendData(Action<TProxy> codeBlock) 
    { 
     try 
     { 
      ClientService<TProxy>.SendData(codeBlock); 
      return true; 
     } 
     catch(Exception ex) 
     { 
      //... 
     } 
     return false; 
    } 

    public static TResult GetData<TResult>(Func<TProxy, TResult> codeBlock) 
    { 
     TResult result = default(TResult); 
     try 
     { 
      result = ClientService<TProxy>.GetData(codeBlock); 
     } 
     catch (Exception ex) 
     { 
      //... 
     } 

     return result; 
    } 
} 

有时候很方便。这里是调用一些服务方法的例子。

var someObj = SomeAnotherService<IMyService>.GetData(x => x.SomeMethod()); 
+0

非常感谢,非常有帮助 - 欣赏花在那里的时间 – Chris

+0

这真的很酷..但如何为此编写单元测试用例。任何其他可以模拟服务参考的方法? – Prashant

2

与WCF代理打交道时,不要使用using。其中一个原因是Dispose()将调用Close()如果代理上Faulted状态,这会抛出异常。所以最好用的是这样的:

var myService = new ServiceClient("httpBinding"); 

try 
{ 
    myService.SomeMethod(); 
} 
catch 
{ 
    // in case of exception, always call Abort*(
    myService.Abort(); 

    // handle the exception 
    MessageBox.Show("error.."); 
} 
finally 
{ 
    myService.Close(); 
} 
+0

的感谢!非常有帮助 – Chris