WCF客户端搭建(通过自定义WCF Client封装)

我一直都比较反感添加服务引用的方式来通过vs生成代理来调用服务的方式。对于WebService Client来说,没有找到比较好的方法,可是对于WCF来说,还是有不少办法可以做的。然而对于WCF 客户端,我也一直也希望能够做到的要求:

1、客户端和服务端尽量做到低耦合,特别对于服务端的修改,客户端能尽量减少修改已至不用修改。

2、对于客户端来说,调用WCF服务的代码要做到简洁、安全、方便和高效。

所以我有了这种想法:

WCF ChannelFactory进行缓存,方便重用,提高性能。

对于服务端的请求,通过Action进行传递,统一调用和处理:

代码如下:

 internal static class ChannelFactoryCreator
{
//存储所有的客户端代理
private static Hashtable channelFactories = new Hashtable();
/// <summary>
/// 根据point名称获得相应的客户端代理
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="endpointName"></param>
/// <returns></returns>
public static ChannelFactory<T> Create<T>(string endpointName)
{
if (string.IsNullOrEmpty(endpointName))
{
throw new ArgumentNullException("endpointName");//*,可以自动查询配置信息中Contract相同的。
}
ChannelFactory<T> channelFactory = null;
if (channelFactories.ContainsKey(endpointName))
{
channelFactory = channelFactories[endpointName] as ChannelFactory<T>;
}
if (channelFactory == null)
{
channelFactory = new ChannelFactory<T>(endpointName);
lock (channelFactories.SyncRoot)
{
channelFactories[endpointName] = channelFactory;
}
}
return channelFactory;

}
/// <summary>
/// 通过Action封装操作
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="action"></param>
/// <param name="endPointName"></param>
public static void UseService<T>(Action<T> action,string endPointName)
{
T channel = Create<T>(endPointName).CreateChannel();
try {
((IClientChannel)channel).Open(); action(channel);
((IClientChannel)channel).Close(); }
catch
{
((IClientChannel)channel).Abort();
}
}

 

转载于:https://www.cnblogs.com/wuyansheng/archive/2012/03/09/2387868.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值