博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
客户端使用自定义代理类访问WCF服务
阅读量:4475 次
发布时间:2019-06-08

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

      通常在客户端访问WCF服务时,都需要添加服务引用,然后在客户端app.config或web.config文件中产生WCF服务的客户端配置信息。若是每添加一个服务都是这样做,这样势必会将比较麻烦,能否简单在app.config或web.config文件增加WCF服务地址,然后直接通过此地址访问WCF服务呢?可以,那就是通过自定义客户端代理类来实现。本文是通过继承ClientBase<T>类实现的自定义客户端代理类,来实现同过简单在app.config或web.config文件增加wcf服务地,然后直接通过此地址访问WCF服务。

      以下以一个简单的计算器WCF服务为例:

     解决方案项目目录结构:

    

   其中WCFExample.ServiceInterface项目是WCF服务接口、WCFExample.ServiceImplement项目是WCF服务实现、WCFExample.Host项目是服务宿主、WCFExample.ServiceClient项目自定义WCF服务客户端代理、WCFExample.ServiceClientTest项目是客户端测试

  WCF服务接口定义

    [ServiceContract]

    public interface ICalculator
    {
        [OperationContract]
        decimal Add(decimal a, decimal b);
    }

  WCF服务接口实现

   public class Calculator : ICalculator

    {
        public decimal Add(decimal a, decimal b)
        {
            return a + b;
        }
    }

  WCF服务客户端自定义代理类

    internal class CalculatorClient : ClientBase<ICalculator>,ICalculator

    {
        public CalculatorClient(Binding binding, EndpointAddress remoteAddress):base(binding,remoteAddress)
        {
        }

        public  decimal Add(decimal a,decimal b)

        {
           return base.Channel.Add(a, b);
        }
    }

   服务创建工厂

internal class ServiceFactory

    {
        public ICalculator GetCalculatorClient(string remotingAddress)
        {
            if(string.IsNullOrEmpty(remotingAddress))
            {
                return null;
            }
            try
            {
                return new CalculatorClient(this.GetInitBinding(), new EndpointAddress(remotingAddress));
            }
            catch
            {
                return null;
            }
        }

        public ICalculator GetCalculatorClient(string remotingAddress, Binding binding)

        {
            if (string.IsNullOrEmpty(remotingAddress))
            {
                return null;
            }
            try
            {
                return new CalculatorClient(binding, new EndpointAddress(remotingAddress));
            }
            catch
            {
                return null;
            }
        }

        private BasicHttpBinding GetInitBinding()

        {
            BasicHttpBinding binding = new BasicHttpBinding();
            binding.MaxBufferSize = 0x27100000;
            binding.MaxReceivedMessageSize = 0x27100000L;
            binding.MaxBufferPoolSize = 0x138800000L;
            XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
            quotas.MaxStringContentLength = 0x4e20000;
            binding.ReaderQuotas = quotas;
            return binding;
        }
    }

    对外服务代理类

  

public class ServiceProxy

    {
        private ICalculator m_ICalculator;
        public ServiceProxy(string remotingAddress)
        {
            m_ICalculator = new ServiceFactory().GetCalculatorClient(remotingAddress);
        }

        public ServiceProxy(string remotingAddress,Binding binding)

        {
            m_ICalculator = new ServiceFactory().GetCalculatorClient(remotingAddress, binding);
        }

        public decimal Add(decimal a,decimal b)

        {
            return m_ICalculator.Add(a, b);
        }
    }

   客户端web.config增加服务地址

<appSettings>

  <add key="WCFAddress" value=">
 </appSettings>

  客户端调用

   decimal a = 10;

   decimal b = 20;
   string url = System.Configuration.ConfigurationManager.AppSettings["WCFAddress"];
   ServiceProxy serviceProxy = new ServiceProxy(url);
   Response.Write(serviceProxy.Add(a,b));

  项目下载:

转载于:https://www.cnblogs.com/binny1983/p/3145730.html

你可能感兴趣的文章
Unity3D游戏,TCP,WEBCOSKT,HTTP通信架构 weaving-socket
查看>>
【小程序入门集锦】19,微信小程序个人帐号申请
查看>>
php写一个简单的计算器
查看>>
【JAVA零基础入门系列】Day3 Java基本数据类型
查看>>
两个整数,求他们的最小公倍数和最大公约数
查看>>
Mongo索引
查看>>
php 实现设计模式之 建造者模式
查看>>
An Easy C Program Problem
查看>>
Replace Nested Conditional with Guard Clauses(用卫语句代替嵌套循环)
查看>>
jsp中${}是EL表达式的常规表示方式
查看>>
GoldenGate常见问题及处理
查看>>
Android JNI学习(五)——Demo演示
查看>>
SSRS 呈现Barcode Free
查看>>
java快速排序引起的StackOverflowError异常
查看>>
泛函编程(35)-泛函Stream IO:IO处理过程-IO Process
查看>>
-XX:-PrintClassHistogram 按下Ctrl+Break后,打印类的信息
查看>>
mac 安装php redis扩展
查看>>
css3中Animation
查看>>
JS 判断是否是手机端并跳转操作
查看>>
最短路径问题(dijkstra-模板)
查看>>