动态修改WCF客户端配置文件终结点的地址的几种方法

     由于服务器端的IP地址是变化的,所以客户端在登录前需要修改连接地址。
    思路一:修改客户端配置文件app.config的<client>节点上<endpoint>的address。
   处理方法如下,但是这个方法有个缺点,就是即便修改配置文件中的地址后,即便是新创建的客户端代理对象,其address依然是修改前的地址,除非重新启动客户端。

    方法如下:

 
    至于是否有办法可以刷新这个地址,答案是否定的。原因是.Net framework 在客户端启动时就将app.config 读入了,而且后面即便修改了app.config文件,也不会刷新app.config的内容。
    至于为什么不重新加载,文章【1】说在通常使用时不可能的。如果要刷新app.config的内容,需要知道app.config的内容何时改变了,这可以通过注册“文件改变通知”事件来实现。然而一旦检测到app.config的内容改变,需要通知所有使用了app.config的组件。
     那么问题就来了, .Net framework 如何来知道哪些组件使用了app.config,由于注册机制的缺陷,是不可能做到。进一步说,实现了所有需要读取app.config的组件在.Net framework中注册这个机制。当.Net framework检测到app.config的改变,它将通知每个注册组件app.config已改变。那么组件该现在该如何做呢?
   为了让app.config新的改变生效,组件不得不重新启动它自己。这意味着组件需要能够刷新旧的配置,以及那些基于旧的配置的数据和行为,然后读取新的配置,并从新的配置开始刷新。
   这是不可能的。举个绑定策略的例子。如果旧的绑定策略认为它需要从装配件(assembly)A中获得版本1,而新的策略认为它需要从从装配件(assembly)A中获得版本2。在装配件(assembly)A的版本1已经加载的情况下, .Net framework 无法为新的绑定策略从装配件(assembly)A中获得版本2。
   仅仅只有一小部分的配置数据可以刷新。这些包括无状态影响或是影响很容易被消除的配置数据。缓存大小就是一个好的例子。在缓存大小改变上,你能重新设置缓存大小,数据仍然保存着,或者简单移除旧的缓存并开启一个新的缓存块。
   通常来说,当app.config发生改变时,确保所有组件一致性的方法是重启应用程序。这个方法.Net framework所采用的。
   ASP.Net有内置的关于app.config发生改变的检测机制,它在监控web.config上发生的改变。一旦它检测到改变,它将关闭旧的应用程序重新启动新的应用程序。
   因此,.Net framework将来也不会提供配置数据刷新的特征,如果你认为这个对于你很重要,你必须自己去实现这个。
   幸运的是企业库("Enterprise Library")那帮人理解了这个需求,他们在最新的企业库版本中开发了个“应用程序配置块”(Configuration Application Block)。

    思路二:如何在不重新启动客户端的情况下改变服务器端的地址。总共有两大类,各有两种情况。
第一大类:对于使用代理类
两种情况:
(1)不使用身份验证
(2)使用身份验证

 

第二大类:对于使用工厂类
两种情况:
(1)不使用身份验证
(2)使用身份验证

 

附带身份验证:

在VS工具的命令行中:

(1)添加证书:

makecert -sr LocalMachine -ss My -a sha1 -n CN=MyWCFServer -sky exchange -pe

(2)将证书设置成可信任的
certmgr -add -r LocalMachine -s My -c -n MyWCFServer -s TrustedPeople

 

请自行修改代码中关于服务器端和客户端配置文件与证书相关的部分。

 

代码下载

 

【1】http://blogs.msdn.com/b/junfeng/archive/2005/02/20/376880.aspx

 

 

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值