using System; using System.ServiceModel; using System.ServiceModel.Description; using System.Text; #if Credentials using System.IdentityModel.Selectors; using System.Security.Cryptography.X509Certificates; using System.ServiceModel.Security; #endif namespace SSWMS.Common { public class WCFService { private string _Url; private string _Status; private ServiceHost ServiceHost; private object S_Service; private Type InterfaceType; public string Url { get { return _Url; } set { _Url = value; } } public string Status { get { return _Status; } set { _Status = value; } } public WCFService(object service) { this.ServiceHost = null; this.S_Service = service; this.InterfaceType = service.GetType().GetInterfaces()[0]; string sServiceName = service.GetType().Name; if (sServiceName == "S_ERPService") { this.Url = string.Format("{0}{1}", AppSettings.ERPServiceUrl, sServiceName); } else { this.Url = string.Format("{0}{1}", AppSettings.ServiceUrl, sServiceName); } this.Status = "停止"; } public void StartService() { if (this.Status == "停止") { this.ServiceHost = new ServiceHost(this.S_Service, new Uri(this.Url)); #if Credentials this.ServiceHost.AddServiceEndpoint(this.InterfaceType, WCFService.GetWSHttpBinding(), ""); this.ServiceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom; this.ServiceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUsernamePasswordValidator(); this.ServiceHost.Credentials.ServiceCertificate.SetCertificate("CN=localhost", StoreLocation.LocalMachine, StoreName.My); #else this.ServiceHost.AddServiceEndpoint(this.InterfaceType, WCFService.GetBasicHttpBinding(), ""); #endif this.ServiceHost.Description.Behaviors.Add(new ServiceThrottlingBehavior() { MaxConcurrentCalls = 3000, MaxConcurrentSessions = 3000 }); this.ServiceHost.Description.Behaviors.Add(new ServiceMetadataBehavior() { HttpGetEnabled = true }); this.ServiceHost.Open(); this.Status = "启动"; } } public void StopService() { if (this.Status == "启动") { if (this.ServiceHost != null) { this.ServiceHost.Close(); this.ServiceHost = null; } this.Status = "停止"; } } public static WSHttpBinding GetWSHttpBinding() { WSHttpBinding wshb = new WSHttpBinding { CloseTimeout = new TimeSpan(0, 0, 30), OpenTimeout = new TimeSpan(0, 0, 30), ReceiveTimeout = new TimeSpan(0, 0, 30), SendTimeout = new TimeSpan(0, 0, 30), MaxBufferPoolSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue, TextEncoding = Encoding.UTF8, MessageEncoding = WSMessageEncoding.Text }; wshb.ReaderQuotas.MaxArrayLength = int.MaxValue; wshb.ReaderQuotas.MaxStringContentLength = int.MaxValue; wshb.ReaderQuotas.MaxBytesPerRead = int.MaxValue; wshb.Security.Mode = SecurityMode.Message; wshb.Security.Message.ClientCredentialType = MessageCredentialType.UserName; return wshb; } public static BasicHttpBinding GetBasicHttpBinding() { BasicHttpBinding bhb = new BasicHttpBinding { CloseTimeout = new TimeSpan(0, 0, 30), OpenTimeout = new TimeSpan(0, 0, 30), ReceiveTimeout = new TimeSpan(0, 0, 30), SendTimeout = new TimeSpan(0, 0, 30), MaxBufferSize = int.MaxValue, MaxBufferPoolSize = int.MaxValue, MaxReceivedMessageSize = int.MaxValue, TextEncoding = Encoding.UTF8, MessageEncoding = WSMessageEncoding.Text }; bhb.ReaderQuotas.MaxArrayLength = int.MaxValue; bhb.ReaderQuotas.MaxStringContentLength = int.MaxValue; bhb.ReaderQuotas.MaxBytesPerRead = int.MaxValue; return bhb; } public static T CreateChannel(string sURL) { #if Credentials ChannelFactory cf = new ChannelFactory(WCFService.GetWSHttpBinding(), new EndpointAddress(sURL)); cf.Credentials.UserName.UserName = "super"; cf.Credentials.UserName.Password = "siasun"; return cf.CreateChannel(); #else return ChannelFactory.CreateChannel(WCFService.GetBasicHttpBinding(), new EndpointAddress(sURL)); #endif } } #if Credentials public class CustomUsernamePasswordValidator : UserNamePasswordValidator { public override void Validate(string userName, string password) { if (userName != "super" || password != "siasun") { throw new Exception("用户名或密码错误。"); } } } #endif }