耕者 发表于 2012-10-24 01:52:45

动态调用WCF地址 (使用ChannelFactory类)

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

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

1 /* ========================================================================
2 * 【本类功能概述】   ChannelFactory 类创建多个终结点侦听器
3 *
4 * 作者:EricHu       时间:2012/6/5 14:14:54
5 * 文件名:WcfChannelFactory
6 * CLR版本:4.0.30319.235
7 *
8 * 修改者:         时间:            
9 * 修改说明:
10 * ========================================================================
11 */
12
13 using System;
14 using System.Collections.Generic;
15 using System.Linq;
16 using System.Text;
17 using System.ServiceModel;
18 using System.ServiceModel.Channels;
19 using System.Reflection;
20
21 namespace JJInn.Baselibray.Common
22 {
23   /// <summary>
24     /// 使用ChannelFactory为wcf客户端创建独立通道
25     /// </summary>
26     public class WcfChannelFactory
27   {
28         public WcfChannelFactory()
29         {
30         }
31
32         /// <summary>
33       /// 执行方法   WSHttpBinding
34       /// </summary>
35       /// <typeparam name="T">服务接口</typeparam>
36       /// <param name="uri">wcf地址</param>
37       /// <param name="methodName">方法名</param>
38       /// <param name="args">参数列表</param>
39       public static object ExecuteMetod<T>(string uri, string methodName, params object[] args)
40         {
41             //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'.。
42             WSHttpBinding binding = new WSHttpBinding();
43             EndpointAddress endpoint = new EndpointAddress(uri);
44
45             using (ChannelFactory<T> channelFactory = new ChannelFactory<T>(binding, endpoint))
46             {
47               T instance = channelFactory.CreateChannel();
48               using (instance as IDisposable)
49               {
50                     try
51                     {
52                         Type type = typeof(T);
53                         MethodInfo mi = type.GetMethod(methodName);
54                         return mi.Invoke(instance, args);
55                     }
56                     catch (TimeoutException)
57                     {
58                         (instance as ICommunicationObject).Abort();
59                         throw;
60                     }
61                     catch (CommunicationException)
62                     {
63                         (instance as ICommunicationObject).Abort();
64                         throw;
65                     }
66                     catch (Exception vErr)
67                     {
68                         (instance as ICommunicationObject).Abort();
69                         throw;
70                     }
71               }
72             }
73
74
75         }
76
77
78         //nettcpbinding 绑定方式
79       public static object ExecuteMethod<T>(string pUrl, string pMethodName,params object[] pParams)
80         {
83               EndpointAddress address = new EndpointAddress(pUrl);
84               Binding bindinginstance = null;
85               NetTcpBinding ws = new NetTcpBinding();
86               ws.MaxReceivedMessageSize = 20971520;
87               ws.Security.Mode = SecurityMode.None;
88               bindinginstance = ws;
89               using (ChannelFactory<T> channel = new ChannelFactory<T>(bindinginstance, address))
90               {
91                     T instance = channel.CreateChannel();
92                     using (instance as IDisposable)
93                     {
94                         try
95                         {
96                           Type type = typeof(T);
97                           MethodInfo mi = type.GetMethod(pMethodName);
98                           return mi.Invoke(instance, pParams);
99                         }
100                         catch (TimeoutException)
101                         {
102                           (instance as ICommunicationObject).Abort();
103                           throw;
104                         }
105                         catch (CommunicationException)
106                         {
107                           (instance as ICommunicationObject).Abort();
108                           throw;
109                         }
110                         catch (Exception vErr)
111                         {
112                           (instance as ICommunicationObject).Abort();
113                           throw;
114                         }
115                     }
116               }
122         }
123   }
124 }
页: [1]
查看完整版本: 动态调用WCF地址 (使用ChannelFactory类)