#region using System; using System.Configuration; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.ServiceModel; using System.Text; using CSFrameworkV5.Core.Common; #endregion namespace CSFrameworkV5.WebRef { /// /// 统一构建WCF通信对象实例 /// public static class WCFFactory { /// /// 创建BasicHttpBinding协议绑定 /// /// public static BasicHttpBinding CreateBasicHttpBinding( bool https = false) { var ws = new BasicHttpBinding(); ws.Name = "BasicHttpBinding"; 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); ws.AllowCookies = false; ws.BypassProxyOnLocal = false; ws.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; ws.MessageEncoding = WSMessageEncoding.Text; ws.TextEncoding = Encoding.UTF8; ws.TransferMode = TransferMode.Buffered; ws.UseDefaultWebProxy = true; //security节点配置 - HTTPS 协议配置 if (https) { ws.Security.Mode = BasicHttpSecurityMode.Transport; ws.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; ws.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; ws.Security.Transport.Realm = ""; } else { //security节点配置 - HTTP协议配置 ws.Security.Mode = BasicHttpSecurityMode.None; ws.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; ws.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; ws.Security.Transport.Realm = ""; } var rq = ws.ReaderQuotas; rq.MaxArrayLength = 2147483647; //最大数组长度 rq.MaxBytesPerRead = 6553600; //最大每次读取长度 rq.MaxDepth = 6553600; // 最大节点深度 rq.MaxNameTableCharCount = 6553600; //最大NameTableChar的数量 rq.MaxStringContentLength = 2147483647; // 最大内容长度 return ws; } /// /// 创建NetTcpBinding协议绑定 /// /// /// public static NetTcpBinding CreateNetTcpBinding(bool https = false) { var ws = new NetTcpBinding(); ws.Name = "NetTcpBinding"; 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); ws.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; ws.PortSharingEnabled = false; //获取或设置一个值,该值指示是否为采用此绑定配置的连接启用 TCP 端口共享。 //ws.MaxConnections = 256;//如果修改maxConnections的值,服务会导致不正常,会报端口已经被占用 //ws.ListenBacklog = 10; ws.TransferMode = TransferMode.Buffered; ws.TransactionProtocol = TransactionProtocol.OleTransactions; ws.TransactionFlow = false; ws.ReliableSession.Ordered = true; ws.ReliableSession.InactivityTimeout = new TimeSpan(0, 10, 0); //security节点配置 - HTTPS 协议配置 if (https) { ws.Security.Mode = SecurityMode.Transport; ws.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; ws.Security.Transport.ProtectionLevel = ProtectionLevel.None; } else { //security节点配置 - HTTP协议配置 ws.Security.Mode = SecurityMode.None; ws.Security.Transport.ClientCredentialType = TcpClientCredentialType.None; ws.Security.Transport.ProtectionLevel = ProtectionLevel.None; } var rq = ws.ReaderQuotas; rq.MaxArrayLength = 2147483647; //最大数组长度 rq.MaxBytesPerRead = 6553600; //最大每次读取长度 rq.MaxDepth = 6553600; // 最大节点深度 rq.MaxNameTableCharCount = 6553600; //最大NameTableChar的数量 rq.MaxStringContentLength = 2147483647; // 最大内容长度 return ws; } /// /// 设置WSHttpBinding参数配置 /// /// public static WSHttpBinding CreateWSHttpBinding(bool https = false) { var ws = new WSHttpBinding(); ws.Name = "wsHttpBinding"; ws.CloseTimeout = new TimeSpan(0, 10, 0); ws.OpenTimeout = new TimeSpan(0, 10, 0); ws.ReceiveTimeout = new TimeSpan(0, 10, 0); ws.SendTimeout = new TimeSpan(0, 10, 0); ws.MaxBufferPoolSize = 2147483647; //从通道接收消息的最大缓存数量 ws.MaxReceivedMessageSize = 2147483647; //最大接收的消息大小 ws.BypassProxyOnLocal = false; ws.TransactionFlow = false; ws.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; ws.MessageEncoding = WSMessageEncoding.Text; ws.TextEncoding = Encoding.UTF8; ws.UseDefaultWebProxy = true; ws.AllowCookies = false; //readerQuotas节点配置 var rq = ws.ReaderQuotas; rq.MaxArrayLength = 2147483647; //最大数组长度 rq.MaxBytesPerRead = 6553600; //最大每次读取长度 rq.MaxDepth = 6553600; // 最大节点深度 rq.MaxNameTableCharCount = 6553600; //最大NameTableChar的数量 rq.MaxStringContentLength = 2147483647; // 最大内容长度 //reliableSession节点配置 ws.ReliableSession.Enabled = false; ws.ReliableSession.Ordered = true; ws.ReliableSession.InactivityTimeout = new TimeSpan(0, 10, 0); //security节点配置 - HTTPS 协议配置 if (https) { ws.Security.Mode = SecurityMode.Transport; ws.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; ws.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; } else { //security节点配置 - HTTP协议配置 ws.Security.Mode = SecurityMode.None; ws.Security.Transport.ClientCredentialType = HttpClientCredentialType.None; ws.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None; } ws.Security.Message.ClientCredentialType = MessageCredentialType.None; ws.Security.Message.EstablishSecurityContext = false; ws.Security.Message.NegotiateServiceCredential = false; return ws; } private static string GetPassword() { var pwd = ConfigurationManager.AppSettings["Windows_Password"]; return KeyProvider.Default.Decrypt(pwd); } private static string GetSSLPassword() { var pwd = ConfigurationManager.AppSettings["SSLPassword"]; return KeyProvider.Default.Decrypt(pwd); } private static string GetUserName() { var name = ConfigurationManager.AppSettings["Windows_UserName"]; return KeyProvider.Default.Decrypt(name); } #region Create方法 /// /// 动态创建WCF接口透明代理 /// /// WCF接口,如:ICommonService /// 连接地址 /// public static T Create(string uri = "") where T : class { //获取WCF接口的名称,如:ICommonService var iName = typeof(T).Name; //获取接口的URI地址,必须是主程序的App.config配置文件 if (string.IsNullOrWhiteSpace(uri)) uri = ConfigurationManager.AppSettings[iName]; //支持4种凭据类型:None/ Basic / Windows / Certificate var UseCredentials = ConfigurationManager.AppSettings["UseCredentials"]; //default:None switch (UseCredentials) { case "Basic": return CreateBasic(uri); //Basic认证,需要指定Windows用户/密码 case "Windows": return CreateWindows(uri); //Windows认证,需要指定Windows用户/密码 case "Certificate": return CreateCertificate(uri); //Certificate认证,需要提供SSL证书文件 default: return CreateNone(uri); } //是否使用https协议,默认false //bool https = System.Configuration.ConfigurationManager.AppSettings["UseHttps"].ToLower() == "true"; //C#动态创建WCF协议配置实例(不依赖App.config配置文件) //var myBinding = CreateWSHttpBinding(https); //获取协议配置并创建实例,必须是主程序的App.config配置文件 //var myBinding = new WSHttpBinding("WSHttpBinding"); //var myBinding = new BasicHttpBinding("BasicHttpBinding"); //var myBinding = new NetTcpBinding("NetTcpBinding"); } /// /// 动态创建WCF接口透明代理 - 无认证模式(None) /// /// WCF接口,如:ICommonService /// 连接地址 /// public static T CreateNone(string uri = "") where T : class { //获取协议配置并创建实例,必须是主程序的App.config配置文件 var myBinding = new WSHttpBinding("WSHttpBinding"); var myEndpoint = new EndpointAddress(new Uri(uri)); var myChannelFactory = new ChannelFactory(myBinding, myEndpoint); //创建WCF通道 var instance = myChannelFactory.CreateChannel(); return instance; } /// /// 动态创建WCF接口透明代理 - BASIC认证 /// /// WCF接口,如:ICommonService /// 连接地址 /// public static T CreateBasic(string uri = "") where T : class { //获取协议配置并创建实例,必须是主程序的App.config配置文件 var myBinding = new WSHttpBinding("WSHttpBinding"); var myEndpoint = new EndpointAddress(new Uri(uri)); var myChannelFactory = new ChannelFactory(myBinding, myEndpoint); //重要!!!设置BASIC认证-需要的本地Windows认证的用户名及密码 myChannelFactory.Credentials.UserName.UserName = GetUserName(); myChannelFactory.Credentials.UserName.Password = GetPassword(); //创建WCF通道 var instance = myChannelFactory.CreateChannel(); return instance; } /// /// 动态创建WCF接口透明代理 - Windows身份认证 /// /// WCF接口,如:ICommonService /// 连接地址 /// public static T CreateWindows(string uri = "") where T : class { //获取协议配置并创建实例,必须是主程序的App.config配置文件 var myBinding = new WSHttpBinding("WSHttpBinding"); var myEndpoint = new EndpointAddress(new Uri(uri)); var myChannelFactory = new ChannelFactory(myBinding, myEndpoint); //重要!!!Windows身份认证-需要的本地Windows认证的用户名及密码 var identity = new NetworkCredential(GetUserName(), GetPassword()); //Windows身份认证信息 myChannelFactory.Credentials.Windows.ClientCredential = identity; //创建WCF通道 var instance = myChannelFactory.CreateChannel(); return instance; } /// /// 动态创建WCF接口透明代理 - Certificate证书认证 /// /// WCF接口,如:ICommonService /// 连接地址 /// public static T CreateCertificate(string uri = "") where T : class { //获取协议配置并创建实例,必须是主程序的App.config配置文件 var myBinding = new WSHttpBinding("WSHttpBinding"); var myEndpoint = new EndpointAddress(new Uri(uri)); var myChannelFactory = new ChannelFactory(myBinding, myEndpoint); //ssl证书文件及密码 var pfxPath = @"C:\Users\Administrator\Downloads\5914048_cs5.manonwo.com.pfx"; var pfxPwd = GetSSLPassword(); //设置客户端证书文件 var clientCer = new X509Certificate2(pfxPath, pfxPwd, X509KeyStorageFlags.MachineKeySet); myChannelFactory.Credentials.ClientCertificate.Certificate = clientCer; //创建WCF通道 var instance = myChannelFactory.CreateChannel(); return instance; } #endregion } }