1
yhj
2024-07-24 5e5d945e91568b973faa27d8ab0bcef99fc4a6c5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#region
 
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using CSFrameworkV5.WCFContract;
 
#endregion
 
namespace CSFrameworkV5.WebRef
{
    /// <summary>
    ///     动态调用WCF接口,动态创建WCF通道
    /// </summary>
    public class WCFInvokeContext
    {
        #region 创建传输协议
 
        /// <summary>
        ///     创建传输协议
        /// </summary>
        /// <param name="binding">传输协议名称</param>
        /// <returns></returns>
        private static Binding CreateBinding(BindingType binding)
        {
            Binding bindinginstance = null;
 
            //BasicHttp传输协议类型,其它类型的协议参考下面的参数配置
            if (binding == BindingType.BasicHttpBinding)
            {
                var ws = new BasicHttpBinding();
                ws.MaxReceivedMessageSize = 2147483647; //最大接收的消息大小 
                ws.MaxBufferSize = 2147483647; // 从通道接收消息的缓存大小 
                ws.MaxBufferPoolSize = 2147483647; //从通道接收消息的最大缓存数量 
                ws.CloseTimeout = new TimeSpan(5, 0, 0); //设5小时
                ws.OpenTimeout = new TimeSpan(5, 0, 0);
                ws.SendTimeout = new TimeSpan(5, 0, 0);
                ws.ReceiveTimeout = new TimeSpan(5, 0, 0);
 
                var rq = ws.ReaderQuotas;
                rq.MaxArrayLength = 2147483647; //最大数组长度 
                rq.MaxBytesPerRead = 6553600; //最大每次读取长度 
                rq.MaxDepth = 6553600; // 最大节点深度 
                rq.MaxNameTableCharCount = 6553600; //最大NameTableChar的数量 
                rq.MaxStringContentLength = 2147483647; // 最大内容长度 
 
                bindinginstance = ws;
            }
            else if (binding == BindingType.NetTcpBinding)
            {
                var ws = new NetTcpBinding();
                ws.Security.Mode = SecurityMode.None;
                bindinginstance = ws;
 
                ws.MaxReceivedMessageSize = 2147483647; //最大接收的消息大小 
                ws.MaxBufferSize = 2147483647; // 从通道接收消息的缓存大小 
                ws.MaxBufferPoolSize = 2147483647; //从通道接收消息的最大缓存数量 
                ws.CloseTimeout = new TimeSpan(0, 10, 0);
                ws.OpenTimeout = new TimeSpan(0, 10, 0);
                ws.SendTimeout = new TimeSpan(0, 10, 0);
                ws.ReceiveTimeout = new TimeSpan(0, 10, 0);
 
                var rq = ws.ReaderQuotas;
                rq.MaxArrayLength = 2147483647; //最大数组长度 
                rq.MaxBytesPerRead = 6553600; //最大每次读取长度 
                rq.MaxDepth = 6553600; // 最大节点深度 
                rq.MaxNameTableCharCount = 6553600; //最大NameTableChar的数量 
                rq.MaxStringContentLength = 2147483647; // 最大内容长度 
 
                bindinginstance = ws;
            }
            else if (binding == BindingType.wsHttpBinding)
            {
                var ws = new WSHttpBinding(SecurityMode.None);
                ws.MaxReceivedMessageSize = 65535000;
                ws.Security.Message.ClientCredentialType =
                    MessageCredentialType.Windows;
                ws.Security.Transport.ClientCredentialType =
                    HttpClientCredentialType.Windows;
                bindinginstance = ws;
            }
 
            return bindinginstance;
        }
 
        #endregion
 
        /// <summary>
        ///     动态调用WCF的方法
        /// </summary>
        /// <typeparam name="T">WCF接口</typeparam>
        /// <param name="url">地址</param>
        /// <param name="methodName">方法名</param>
        /// <param name="Params">参数</param>
        /// <returns></returns>
        public static object ExecuteMethod<T>(string url, string methodName,
            params object[] Params)
        {
            var address = new EndpointAddress(url);
            Binding bindinginstance = null;
 
            //HTTP协议
            var ht = new BasicHttpBinding();
            ht.MaxReceivedMessageSize = 20971520;
            ht.Security.Mode = BasicHttpSecurityMode.None;
            bindinginstance = ht;
 
            using (var channel =
                   new ChannelFactory<T>(bindinginstance, address))
            {
                var instance = channel.CreateChannel();
                using (instance as IDisposable)
                {
                    try
                    {
                        var type = typeof(T);
                        var mi = type.GetMethod(methodName);
                        return mi.Invoke(instance, Params);
                    }
                    catch (TimeoutException)
                    {
                        (instance as ICommunicationObject).Abort();
                        throw;
                    }
                    catch (CommunicationException)
                    {
                        (instance as ICommunicationObject).Abort();
                        throw;
                    }
                    catch (Exception)
                    {
                        (instance as ICommunicationObject).Abort();
                        throw;
                    }
                }
            }
        }
 
        #region WCF服务工厂 Create方法
 
        /// <summary>
        ///     创建WCF服务客户端实例
        /// </summary>
        /// <typeparam name="T">接口类型,WCF契约</typeparam>
        /// <param name="url">WCF服务地址</param>
        /// <returns>返回WCF服务客户端实例</returns>
        public static T CreateWCFService<T>(string url)
        {
            return CreateWCFService<T>(url, BindingType.BasicHttpBinding);
        }
 
        /// <summary>
        ///     创建WCF服务客户端实例
        /// </summary>
        /// <typeparam name="T">接口类型,WCF契约</typeparam>
        /// <param name="url">WCF服务地址</param>
        /// <param name="bing">协议类型</param>
        /// <returns>返回WCF服务客户端实例</returns>
        public static T CreateWCFService<T>(string url, BindingType bing)
        {
            var address = new EndpointAddress(url);
            var binding = CreateBinding(bing);
            var factory = new ChannelFactory<T>(binding, address);
            return factory.CreateChannel();
        }
 
        /// <summary>
        ///     创建WCF服务的客户端实例
        /// </summary>
        /// <typeparam name="T">接口类型,WCF契约</typeparam>
        /// <param name="url">WCF服务地址</param>
        /// <param name="binding">协议</param>
        /// <returns>返回WCF的客户端实例</returns>
        public static T CreateWCFService<T>(string url, Binding binding)
        {
            var address = new EndpointAddress(url);
            var factory = new ChannelFactory<T>(binding, address);
            return factory.CreateChannel();
        }
 
        #endregion
    }
}