动态调用WCF

最近在做的一个项目中需要动态调用WCF地址,因为有很多终端服务器,而每台终端服务器上都部署一个WCF服务,中央服务器需要不定时调用其中某个或者多个WCF服务执行相关操作,因此添加引用及配置文件配置的方法就不太现实,以下提供两种动态调用WCF地址的方法:

1、使用ChannelFactory类,该方法虽然复杂了点,但灵活度最高:

code:

/* ========================================================================
 * 【本类功能概述】   ChannelFactory 类创建多个终结点侦听器
 * 
 * 作者:EricHu       时间:2012/6/5 14:14:54
 * 文件名:WcfChannelFactory
 * CLR版本:4.0.30319.235
 *
 * 修改者:           时间:              
 * 修改说明:
 * ========================================================================
 */
 
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.ServiceModel;
 using System.ServiceModel.Channels;
 using System.Reflection;
 
 namespace JJInn.Baselibray.Common
 {
     /// <summary>
     /// 使用ChannelFactory为wcf客户端创建独立通道
     /// </summary>
     public class WcfChannelFactory
     {
         public WcfChannelFactory()
         {
         }
 
         /// <summary>
         /// 执行方法   WSHttpBinding
         /// </summary>
         /// <typeparam name="T">服务接口</typeparam>
         /// <param name="uri">wcf地址</param>
         /// <param name="methodName">方法名</param>
         /// <param name="args">参数列表</param>
         public static object ExecuteMetod<T>(string uri, string methodName, params object[] args)
         {
             //BasicHttpBinding binding = new BasicHttpBinding();   //出现异常:远程服务器返回错误: (415) Cannot process the message because the content type 'text/xml; charset=utf-8' was not the expected type 'application/soap+xml; charset=utf-8'.。
             WSHttpBinding binding = new WSHttpBinding();
             EndpointAddress endpoint = new EndpointAddress(uri);
 
             using (ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint))
             {
                 T instance = channelFactory.CreateChannel();
                 using (instance as IDisposable)
                 {
                     try
                     {
                         Type type = typeof(T);
                         MethodInfo mi = type.GetMethod(methodName);
                         return mi.Invoke(instance, args);
                     }
                     catch (TimeoutException)
                     {
                         (instance as ICommunicationObject).Abort();
                         throw;
                     }
                     catch (CommunicationException)
                     {
                         (instance as ICommunicationObject).Abort();
                         throw;
                     }
                     catch (Exception vErr)
                     {
                         (instance as ICommunicationObject).Abort();
                         throw;
                     }
                 }
             }
 
 
         }
 
 
         //nettcpbinding 绑定方式
         public static object ExecuteMethod<T>(string pUrl, string pMethodName,params object[] pParams)
         {
                 EndpointAddress address = new EndpointAddress(pUrl);
                 Binding bindinginstance = null;
                 NetTcpBinding ws = new NetTcpBinding();
                 ws.MaxReceivedMessageSize = 20971520;
                 ws.Security.Mode = SecurityMode.None;
                 bindinginstance = ws;
                 using (ChannelFactory<T> channel = new ChannelFactory<T>(bindinginstance, address))
                 {
                     T instance = channel.CreateChannel();
                     using (instance as IDisposable)
                     {
                         try
                         {
                             Type type = typeof(T);
                             MethodInfo mi = type.GetMethod(pMethodName);
                             return mi.Invoke(instance, pParams);
                         }
                         catch (TimeoutException)
                         {
                             (instance as ICommunicationObject).Abort();
                             throw;
                         }
                         catch (CommunicationException)
                         {
                             (instance as ICommunicationObject).Abort();
                             throw;
                         }
                         catch (Exception vErr)
                         {
                             (instance as ICommunicationObject).Abort();
                             throw;
                         }
                     }
                 }
         }
     }
 }
View Code

 

调用示例:

string uri = "http://localhost:9998/mywcf/Service";
object o = ExecuteMetod<IService>(uri, "Add",12.0,13.0);
Console.WriteLine(o.ToString());
Console.ReadKey();

 

2、简单方法,不考虑太多,直接调用:

EndpointAddress address1 = new EndpointAddress("http://localhost:9998/mywcf/Service");
ServiceClient service1 = new ServiceClient(new WSHttpBinding(), address1);
Console.WriteLine(service1.Add(12.0, 13.0).ToString());

 

posted @ 2016-06-02 16:23  程序员徐坤  阅读(262)  评论(0编辑  收藏  举报