WCFendpoint wed = config.Where(i => i.Name == key).FirstOrDefault();
WSHttpBinding wsb = new WSHttpBinding();
//安全设置和超时设置是设置在binding上的
wsb.Security = new WSHttpSecurity();
wsb.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
wsb.SendTimeout = wed.TimeOut;
//dnsindentity设置(跟证书有关)是写在EndpointAddress里的
EndpointAddress ea = new EndpointAddress(new Uri(wed.Url), EndpointIdentity.CreateDnsIdentity("CETServerCertificate"));
channelFactory = new ChannelFactory<T>(wsb, ea);
//用户名,密码,还是x509证书什么的,都写在channelFactory里面
channelFactory.Credentials.UserName.UserName = "Admin";
channelFactory.Credentials.UserName.Password = "123456";
//这是自定义写法
channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.Custom;
channelFactory.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new MyX509Validator();
//这是一般写法
// channelFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "Client1");
// channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
//一个工厂是可以静态化,常驻内存的
lock (channelFactories.SyncRoot)
{
channelFactories[key] = channelFactory;
}
然后再通过代理技术封装,可以在代理里面添加用户名,密码等公共信息,可以进行运行统计。
详细的代码