博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WCF客户端
阅读量:6074 次
发布时间:2019-06-20

本文共 2867 字,大约阅读时间需要 9 分钟。

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

 

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

 

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

 

 
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 { 
get
set; }
        
///
 
<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(
this
new 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(
this
new 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

你可能感兴趣的文章
Android -- 加载大图片的方法
查看>>
Blend 3状态为空的解决方法
查看>>
什么样的企业可以称之为初创企业?
查看>>
安全厂商间真的能“数据共享,协同合作”吗
查看>>
那些优秀程序员身上的共同特质
查看>>
Python爬虫之BeautifulSoup
查看>>
《HTML 5与CSS 3权威指南(第3版·下册)》——第20章 使用选择器在页面中插入内容...
查看>>
空中鼠标算法原理讨论
查看>>
UITableView整理
查看>>
Akka笔记之Actor简介
查看>>
Android 使用SystemBarTint设置状态栏颜色
查看>>
GreenPlum vs MonetDB case
查看>>
JVM源码分析之SystemGC完全解读
查看>>
盘点 PHP 和 ASP.NET 的10大对比!
查看>>
Systemtap examples, Identifying Contended User-Space Locks
查看>>
PostgreSQL Daily Maintenance - cluster table
查看>>
Problem8
查看>>
Git 自救指南
查看>>
async和await详解
查看>>
仿写一个android图片压缩工具
查看>>