最近做一个项目,需要在客户端灵活配置连接到哪个服务器的功能,例如客户端是一个,现在想连接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;
}
}
}
}
// 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 >
< 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 >
不足之处欢迎指点交流。