WCF客户端动态设置WCF服务器主机的地址的方法参考,可以连接多个相同WCF主机的方法
2013-05-10 13:10
555 查看
最近做一个项目,需要在客户端灵活配置连接到哪个服务器的功能,例如客户端是一个,现在想连接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>
publicclass ServiceFactory : IServiceFactory
{
privatestring host =string.Empty;
///<summary>
/// 主机地址
/// Host = "192.168.0.122";
///</summary>
publicstring Host
{
get
{
return host;
}
set
{
host = value;
}
}
privateint port =0;
///<summary>
/// 端口号
///</summary>
publicint Port
{
get
{
return port;
}
set
{
port = value;
}
}
public ServiceFactory()
{
}
///<summary>
/// 初始化服务
///</summary>
publicvoid InitService()
{
}
///<summary>
/// 动态设定WCF主机地址端口的方法
///</summary>
///<param name="address">主机地址</param>
///<returns>主机地址</returns>
publicvirtual 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;
}
publicvirtual 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>
不足之处欢迎指点交流。
参考核心代码如下:
//--------------------------------------------------------------------
// 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>
publicclass ServiceFactory : IServiceFactory
{
privatestring host =string.Empty;
///<summary>
/// 主机地址
/// Host = "192.168.0.122";
///</summary>
publicstring Host
{
get
{
return host;
}
set
{
host = value;
}
}
privateint port =0;
///<summary>
/// 端口号
///</summary>
publicint Port
{
get
{
return port;
}
set
{
port = value;
}
}
public ServiceFactory()
{
}
///<summary>
/// 初始化服务
///</summary>
publicvoid InitService()
{
}
///<summary>
/// 动态设定WCF主机地址端口的方法
///</summary>
///<param name="address">主机地址</param>
///<returns>主机地址</returns>
publicvirtual 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;
}
publicvirtual 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>
不足之处欢迎指点交流。
相关文章推荐
- WCF客户端动态设置WCF服务器主机的地址的方法参考,可以连接多个相同WCF主机的方法
- WCF客户端动态设置WCF服务器主机的地址的方法参考,可以连接多个相同WCF主机的方法
- WCF 客户端与服务器时间不同步无法连接的解决方法
- WCF 客户端与服务器时间不同步无法连接的解决方法
- WCF 客户端与服务器时间不同步无法连接的解决方法
- 动态修改WCF客户端配置文件终结点的地址的几种方法
- 动态修改WCF客户端配置文件终结点的地址的几种方法
- WCF 客户端与服务器时间不同步无法连接的解决方法
- WCF项目中客户端与服务器时间问题步无法连接的解决方案 (供自己以后参考)
- 动态修改WCF客户端配置文件终结点的地址的几种方法
- Silverlight程序中动态设置WCF服务地址方法
- Silverlight程序中动态设置WCF服务地址方法
- Silverlight程序中动态设置WCF服务地址方法
- 网狐棋牌客户端连接服务器修改方法
- 只想使某个IP的计算机才能连接到SQL Server服务器,不允许其他客户端连接的方法
- 服务器中判断客户端socket断开连接的方法
- 无客户端连接oracle服务器的实现方法
- 【ZooKeeper Notes 29】 修复“ZooKeeper客户端打印当前连接的服务器地址为null”的Bug问题描述
- Java的InetAddress.getByName方法不指定主机名却可以确定主机的 IP 地址,真意外!
- 当sql2000无法远程连接时 可以设置路由器映射的方法解决