zoukankan      html  css  js  c++  java
  • WCF客户端搭建(通过自定义WCF Client封装) wu

    我一直都比较反感添加服务引用的方式来通过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();
    }
    }
  • 相关阅读:
    2021 6 3
    2021 5月 读书笔记
    2021 6 1
    第十三周 2021.05.30
    spring security permitAll不生效
    springboot配置jpa提示Unable to resolve name [mysql] as strategy
    element el-form-item el-input宽度设置
    vue+element表格中使用render函数(if判断处理)
    elementui移除tab报Avoided redundant navigation to current location: ***
    el-dropdown-item添加@click不生效
  • 原文地址:https://www.cnblogs.com/wuyansheng/p/2387868.html
Copyright © 2011-2022 走看看