最近做一个项目,需要在客户端灵活配置连接到哪个服务器的功能,例如客户端是一个,现在想连接A服务器就连A服务器,想连接B服务器就连接B服务器,当然不需要手动修改配置文件,直接通过程序来实现WCF目标主机的配置功能。
参考核心代码如下:
// -------------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2011 , Hairihan TECH, Ltd. // -------------------------------------------------------------------- using System.ServiceModel; namespace DotNet.WCFClient { using DotNet.IService; using DotNet.Utilities; /// <summary> /// ServiceFactory /// 本地服务的具体实现接口 /// /// 修改纪录 /// /// 2011.07.03 版本:2.0 JiRiGaLa 可以动态指定服务器地址的调用方法。 /// 2009.09.20 版本:1.0 JiRiGaLa 创建。 /// /// 版本:2.0 /// /// <author> /// <name> JiRiGaLa </name> /// <date> 2011.07.03 </date> /// </author> /// </summary> public class ServiceFactory : IServiceFactory { private string host = string .Empty; /// <summary> /// 主机地址 /// Host = "192.168.0.122"; /// </summary> public string Host { get { return host; } set { host = value; } } private int port = 0 ; /// <summary> /// 端口号 /// </summary> public int Port { get { return port; } set { port = value; } } public ServiceFactory() { } /// <summary> /// 初始化服务 /// </summary> public void InitService() { } /// <summary> /// 动态设定WCF主机地址端口的方法 /// </summary> /// <param name="address"> 主机地址 </param> /// <returns> 主机地址 </returns> public virtual EndpointAddress GetHotsUrl(EndpointAddress address) { // 若当前配置都是空的,就不用生成新的URL了。 if ( string .IsNullOrEmpty(Host) && (Port == 0 )) { return address; } // 判断当前配置的情况 string endpointAddress = string .Empty; if ( string .IsNullOrEmpty(Host)) { Host = address.Uri.Host; } if (Port == 0 ) { Port = address.Uri.Port; } endpointAddress = address.Uri.Scheme + " :// " + Host + " : " + Port.ToString() + address.Uri.LocalPath; address = new EndpointAddress(endpointAddress); return address; } public virtual ISequenceService CreateSequenceService() { ChannelFactory < ISequenceService > channelFactory = new ChannelFactory < ISequenceService > ( " DotNet.Service.SequenceService " ); channelFactory.Endpoint.Address = GetHotsUrl(channelFactory.Endpoint.Address); // 加强安全验证防止未授权匿名调用 channelFactory.Credentials.UserName.UserName = BaseSystemInfo.ServiceUserName; channelFactory.Credentials.UserName.Password = BaseSystemInfo.ServicePassword; ISequenceService proxy = channelFactory.CreateChannel(); return proxy; } } } }
配套的配置文件参考如下:
<? xml version = " 1.0 " ?> < configuration > < system.serviceModel > < client > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/ExceptionService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IExceptionService " name = " DotNet.Service.ExceptionService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/FileService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IFileService " name = " DotNet.Service.FileService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/FolderService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IFolderService " name = " DotNet.Service.FolderService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/ItemDetailsService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IItemDetailsService " name = " DotNet.Service.ItemDetailsService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/ItemsService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IItemsService " name = " DotNet.Service.ItemsService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/LogOnService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.ILogOnService " name = " DotNet.Service.LogOnService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/LogService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.ILogService " name = " DotNet.Service.LogService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/MessageService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IMessageService " name = " DotNet.Service.MessageService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/ModuleService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IModuleService " name = " DotNet.Service.ModuleService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/OrganizeService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IOrganizeService " name = " DotNet.Service.OrganizeService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/ParameterService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IParameterService " name = " DotNet.Service.ParameterService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/PermissionItemService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IPermissionItemService " name = " DotNet.Service.PermissionItemService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/PermissionService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IPermissionService " name = " DotNet.Service.PermissionService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/RoleService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IRoleService " name = " DotNet.Service.RoleService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/SequenceService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.ISequenceService " name = " DotNet.Service.SequenceService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/StaffService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IStaffService " name = " DotNet.Service.StaffService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/UserService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IUserService " name = " DotNet.Service.UserService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/BusinessDbHelperService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IDbHelperService " name = " DotNet.Service.BusinessDbHelperService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/UserCenterDbHelperService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IDbHelperService " name = " DotNet.Service.UserCenterDbHelperService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/WorkFlowActivityAdminService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IWorkFlowActivityAdminService " name = " DotNet.Service.WorkFlowActivityAdminService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/WorkFlowCurrentService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IWorkFlowCurrentService " name = " DotNet.Service.WorkFlowCurrentService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/WorkFlowProcessAdminService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.IWorkFlowProcessAdminService " name = " DotNet.Service.WorkFlowProcessAdminService " ></ endpoint > < endpoint address = " net.tcp://jirigala-PC:8888/DotNet.Service/TableColumnsService/ " binding = " netTcpBinding " bindingConfiguration = " netTcpBindingSmiple " contract = " DotNet.IService.ITableColumnsService " name = " DotNet.Service.TableColumnsService " ></ endpoint > </ client > < bindings > < netTcpBinding > < binding name = " netTcpBindingSmiple " maxBufferPoolSize = " 2147483647 " maxReceivedMessageSize = " 2147483647 " closeTimeout = " 00:00:05 " openTimeout = " 00:00:02 " receiveTimeout = " 10:10:10 " sendTimeout = " 00:00:30 " > < security mode = " Message " > < message clientCredentialType = " UserName " /> </ security > </ binding > </ netTcpBinding > </ bindings > </ system.serviceModel > </ configuration >
不足之处欢迎指点交流。
将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。