WCF客户端

随着WCF越来越被更多的人认可,使用也越来越广泛。但在使用过程中也确实存在着某些让开发者不放便的地方,例如:

 

   using (ChannelFactory<ICompute> channelFactory =  new ChannelFactory<ICompute>( " ICompute "))
                    {
                        ICompute proxy = channelFactory.CreateChannel();
                        proxy.Add( 11);
                    }

 

像这样的写法让人看起来有些不舒服。因此,为了方便使用还是有必要整理一下的。

 

  public  class ServiceClient
    {
         private  static ServiceClient _instance;
         ///   <summary>
        
///  对象实例
        
///   </summary>
         public  static ServiceClient Instance
        {
             get {  return _instance ?? (_instance =  new ServiceClient()); }
        }
         ///   <summary>
        
///  通讯发生错误触发
        
///   </summary>
         public  static  event EventHandler<ServiceFaultedArges> Faulted;
         ///   <summary>
        
///  服务终结点
        
///   </summary>
         public  static String EndpointName {  getset; }

         ///   <summary>
        
///  执行服务方法,带返回值
        
///   </summary>
        
///   <typeparam name="TChannel"> 契约接口 </typeparam>
        
///   <typeparam name="TReturn"> 返回类型 </typeparam>
        
///   <param name="func"> 执行方法委托 </param>
        
///   <returns></returns>
         public TReturn Execute<TChannel, TReturn>(Func<TChannel, TReturn> func)
        {
             var errorMsg =  "";
             try
            {
                 var channel = GetChannel<TChannel>();
                 var result = func(channel);
                 try
                {
                    ((IClientChannel)channel).Close();
                }
                 catch
                {
                    ((IClientChannel)channel).Abort();
                }
                 return result;
            }
             catch (CommunicationException ex)
            {
                errorMsg = ex.Message;
            }
             catch (TimeoutException ex)
            {
                errorMsg = ex.Message;
            }
             catch (Exception ex)
            {
                errorMsg = ex.Message;
            }
            Faulted( thisnew ServiceFaultedArges() { ErrorMsg =errorMsg});
             return  default(TReturn);
        }
         ///   <summary>
        
///  执行服务方法,不带返回值
        
///   </summary>
        
///   <typeparam name="TChannel"> 契约接口 </typeparam>
        
///   <param name="func"> 执行方法委托 </param>
         public  void Execute<TChannel>(Action<TChannel> func)
        {
             var errorMsg =  string.Empty;
             try
            {
                 var channel = GetChannel<TChannel>();
                func(channel);
                 try
                {
                    ((IClientChannel)channel).Close();
                }
                 catch
                {
                    ((IClientChannel)channel).Abort();
                }
            }
             catch (CommunicationException ex)
            {
                errorMsg = ex.Message;
            }
             catch (TimeoutException ex)
            {
                errorMsg = ex.Message;
            }
             catch (Exception ex)
            {
                errorMsg = ex.Message;
            }
            Faulted( thisnew ServiceFaultedArges() { ErrorMsg = errorMsg });
        }
         ///   <summary>
        
///  初始化代理
        
///   </summary>
        
///   <typeparam name="TChannel"></typeparam>
        
///   <returns></returns>
         private  static TChannel GetChannel<TChannel>()
        {
             var chanFactory =  new ChannelFactory<TChannel>(EndpointName);
            //  if (Faulted != null) chanFactory.Faulted += Faulted;
             return chanFactory.CreateChannel();
        }
    }

 

客户端调用:

 

  static  void Main( string[] args)
        {

            Common.WCF.ServiceClient.EndpointName =  " ICompute1 ";
            Common.WCF.ServiceClient.Faulted += Faulted;
             var result= Common.WCF.ServiceClient.Instance.Execute<Snail.WCFServices.Contracts.ICompute,  double>(ent => ent.Add( 1, 2));
            Console.Write(result);
            Console.ReadKey();
        }

         private  static  void Faulted( object sender, ServiceFaultedArges e)
        {
            Console.Write(e.ErrorMsg);
        }

 

这样使用起来就方便多了,对于异常的处理和写日志也变得轻松,也不再动不动就整个页面就黄了...哈哈

      以上为本人拙见,如有发现问题欢迎指正,如有更好的方法也请赐教,相互学习,一起成长...

 

转载于:https://www.cnblogs.com/luojianguang/p/3143274.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值