• C#动态调用WCF接口


    这种方式比较简单,而且也是大家喜欢的,因为不需要任何配置文件就可解决,只需知道服务契约接口和服务地址就可以调用。

    string url = "http://localhost:3000/DoubleService.svc";
    IDoubleService proxy = WcfInvokeFactory.CreateServiceByUrl<IDoubleService>(url);
    int result = proxy.Add(1, 3);

    需要用到的类

    public class WcfInvokeFactory
       {
           #region WCF服务工厂
           public static T CreateServiceByUrl<T>(string url)
           {
               return CreateServiceByUrl<T>(url, "basicHttpBinding");
           }
     
           public static T CreateServiceByUrl<T>(string url, string bing)
           {
               try
               {
                   if (string.IsNullOrEmpty(url)) throw new NotSupportedException("This url is not Null or Empty!");
                   EndpointAddress address = new EndpointAddress(url);
                   Binding binding = CreateBinding(bing);
                   ChannelFactory<T> factory = new ChannelFactory<T>(binding, address);
                   return factory.CreateChannel();
               }
               catch (Exception ex)
               {
                   throw new Exception("创建服务工厂出现异常.");
               }
           }
           #endregion
     
           #region 创建传输协议
           /// <summary>
           /// 创建传输协议
           /// </summary>
           /// <param name="binding">传输协议名称</param>
           /// <returns></returns>
           private static Binding CreateBinding(string binding)
           {
               Binding bindinginstance = null;
               if (binding.ToLower() == "basichttpbinding")
               {
                   BasicHttpBinding ws = new BasicHttpBinding();
                   ws.MaxBufferSize = 2147483647;
                   ws.MaxBufferPoolSize = 2147483647;
                   ws.MaxReceivedMessageSize = 2147483647;
                   ws.ReaderQuotas.MaxStringContentLength = 2147483647;
                   ws.CloseTimeout = new TimeSpan(0, 30, 0);
                   ws.OpenTimeout = new TimeSpan(0, 30, 0);
                   ws.ReceiveTimeout = new TimeSpan(0, 30, 0);
                   ws.SendTimeout = new TimeSpan(0, 30, 0);
     
                   bindinginstance = ws;
               }
               else if (binding.ToLower() == "nettcpbinding")
               {
                   NetTcpBinding ws = new NetTcpBinding();
                   ws.MaxReceivedMessageSize = 65535000;
                   ws.Security.Mode = SecurityMode.None;
                   bindinginstance = ws;
               }
               else if (binding.ToLower() == "wshttpbinding")
               {
                   WSHttpBinding ws = new WSHttpBinding(SecurityMode.None);
                   ws.MaxReceivedMessageSize = 65535000;
                   ws.Security.Message.ClientCredentialType = System.ServiceModel.MessageCredentialType.Windows;
                   ws.Security.Transport.ClientCredentialType = System.ServiceModel.HttpClientCredentialType.Windows;
                   bindinginstance = ws;
               }
               return bindinginstance;
     
           }
           #endregion
       }

    不需要任何配置文件,适合配置多个wcf,然后在后台win服务动态调用的使用场景。

  • 相关阅读:
    java并发系列(六)-----Java并发:volatile关键字解析(内存语义、实现原理)
    java并发系列(五)-----如何正确的关闭一个线程
    23.备忘录模式(Memento Pattern)
    22.访问者模式(Vistor Pattern)
    21.责任链模式
    20.策略者模式(Stragety Pattern)
    19.状态者模式(State Pattern)
    18.中介者模式(Mediator Pattern)
    17.观察者模式(Observer Pattern)
    16.迭代器模式(Iterator Pattern)
  • 原文地址:https://www.cnblogs.com/tuyile006/p/6999627.html
Copyright © 2020-2023  润新知