最近做一个项目,需要在客户端灵活配置连接到哪个服务器的功能,例如客户端是一个,现在想连接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>

不足之处欢迎指点交流。

转载于:https://blog.51cto.com/2347979/1197391

WCF客户端动态设置WCF服务器主机的地址的方法参考,可以连接多个相同WCF主机的方法...相关推荐

  1. wcf客户端动态嗅探服务实例

    参照博客园蒋金楠老师的博客和MSDN的一片文章,现在把wcf客户端动态嗅探wcf服务用一个实例来做出总结. 在以往的wcf客户端应用的时候,我们需要提供客户服务地址和端口或者管道,当然有时候需要我们服 ...

  2. 邮箱客户端如何设置绑定邮箱账号地址?

    由于近期的工作需要公司注册了一个容量大且安全性高的企业邮箱,在知乎上找了下,TOM企业邮箱安全性很高,还是个国际邮箱.注册好后,公司技术部门要求大家在邮箱客户端登录,作为邮箱管理员的我,对这个邮箱客户 ...

  3. jqgrid 动态设置单元格不可编辑

    单元格可编辑需要设置3个地方 1.tableGrid里面的参数 cellEdit:true(开启行编辑功能)  false(默认,不可编辑) 2.cellsubmit: 'clientArray' 设 ...

  4. Silverlight动态设置WCF服务Endpoint

    去年12月收到一位朋友的邮件,咨询Silverlight使用WCF服务,应用部署后一直无法访问的问题,通过几次交流,才发现在他的项目中,全部使用静态URL作为WCF服务的Endpoint地址,后来修改 ...

  5. WCF 服务端+客户端动态调用

    最近在写WCF服务相关代码,把项目中用到的通讯框架做了下整理,以备以后自己记忆. WCF服务端: 包含契约定义:WCF.Contract.契约实现:WCF.Service 以及宿主主程序:WcfSer ...

  6. WCF系列教程之WCF客户端调用服务

    1.创建WCF客户端应用程序需要执行下列步骤 (1).获取服务终结点的服务协定.绑定以及地址信息 (2).使用该信息创建WCF客户端 (3).调用操作 (4).关闭WCF客户端对象 二.操作实例 1. ...

  7. 无配置WCF客户端的一个简单到令人发指的实现方法

    因为项目比较大,接口一大堆,同时也是为了模块间完全解耦(只依赖Common),只能是采用多个WCF服务类库的方案.这样带来的问题就是上帝都不知道在配置文件中到底需要配置多少个Endpoint!理论上是 ...

  8. .NET 3.5 中WCF客户端代理性能改进以及最佳实践

    介绍 在.NET 3.0 SP1(与.NET 3.5一起发布) 中,WCF客户端创建有一个重要的性能改进.对BasicHttpBinding 来说,性能已经接近于创建ASMX代理. ASMX 代理 v ...

  9. WCF 第一章 基础 为一个ASMX服务实现一个WCF客户端

    WCF客户端可以调用任何基于标准的服务而不用考虑目标宿主环境.在.NET Framework 1.1 上创建的ASMX网络服务是完全兼容的.由WS-I 1.1基本概况定义的标准确保它们可以被WCF调用 ...

  10. 创建WCF客户端调用

    创建一个新项目,WCF客户端,来调用我们的WCF服务端.我们使用控制台程序,运行环境用的是**.net core 3.1**. 一.添加服务应用 选择WCF Service,点击下一步 将上篇文章的W ...

最新文章

  1. springmvc常用注解标签详解
  2. 我的C#学习笔记(1)
  3. VScode中html怎么引入js,vscode中如何使用typescript,如何自动编译成js文件
  4. scjp考试准备 - 2 - 逻辑运算及类型转换
  5. concurrent map使用
  6. 进程与线程的区别:最浅显易懂的解释
  7. 作者:罗圣美,男,中兴通讯股份有限公司首席架构师。
  8. 07 -模型层ORM
  9. Julia: 如何转换PyPlot的X轴的日期格式?
  10. C#使用webclient下载图片返回403forbiden
  11. 马尔科夫蒙特卡洛算法(MCMC)
  12. iOS15绕过激活锁工具TiggerRamDisk3.6,支持最新iOS15.5绕过
  13. ubuntu中的坑——Ubuntu中一些常用的软件和火狐浏览器插件的安装
  14. ARINC429数据总线简介
  15. Excel表格如何筛选重复内容(筛选重复数据的方法)
  16. AndroidStudio安装之后虚拟机启动失败解决方法
  17. 联网获取360数据,识别骚扰电话,java实现
  18. Designing an Encoder for StyleGAN Image Manipulation论文解读
  19. Nginx目录结构、编译参数、状态码概述
  20. Springboot + Shiro——MD5 盐值加密(配置)

热门文章

  1. 树莓派桌面没有时间_树莓派3B/3B+开启手机远程桌面和终端,没有屏幕和电脑的伙伴们有福啦!...
  2. 汇编实现冒泡法排序及优化
  3. 《Android Framework-跨进程通信高级实战课》笔记
  4. surging+EFCore 服务实现入门
  5. oracle数据库表用序列实现主键自增长
  6. cookie Web Storage API
  7. Docker简介及Linux下安装
  8. 一行代码解决各种IE兼容问题,IE6,IE7,IE8,IE9,IE10 (转)
  9. gtest简短,简单易用
  10. 《数据结构》二叉查找树