當前位置:編程學習大全網 - 編程語言 - 動態修改WCF客戶端配置文件終結點的地址的幾種方法

動態修改WCF客戶端配置文件終結點的地址的幾種方法

 由於服務器端的IP地址是變化的 所以客戶端在登錄前需要修改連接地址

 思路壹 修改客戶端配置文件nfig的<client>節點上<endpoint>的address

 處理方法如下 但是這個方法有個缺點 就是即便修改配置文件中的地址後 即便是新創建的客戶端代理對象 其address依然是修改前的地址 除非重新啟動客戶端

  方法如下

 private void UpdateConfig(string serverIPAddress string serverPort)

 {

 //Configuration config = ConfigurationManager OpenExeConfiguration(Assembly GetEntryAssembly() Location);

 Configuration config = ConfigurationManager OpenExeConfiguration(ConfigurationUserLevel None);

 ConfigurationSectionGroup sct = config SectionGroups[ system serviceModel ];

 ServiceModelSectionGroup serviceModelSectionGroup = sct as ServiceModelSectionGroup;

 ClientSection clientSection = serviceModelSectionGroup Client;

 foreach (ChannelEndpointElement item in clientSection Endpoints)

 {

 string pattern = :// */ ;

 string address = item Address ToString();

 string replacement = string Format( ://{ }:{ }/ serverIPAddress serverPort);

 address = Regex Replace(address pattern replacement);

 item Address = new Uri(address);

 }

 config Save(ConfigurationSaveMode Modified);

 ConfigurationManager RefreshSection( system serviceModel );

 }

 至於是否有辦法可以刷新這個地址 答案是否定的 原因是 Net framework 在客戶端啟動時就將nfig 讀入了 而且後面即便修改了nfig文件 也不會刷新nfig的內容

 至於為什麽不重新加載 文章 說在通常使用時不可能的 如果要刷新nfig的內容 需要知道nfig的內容何時改變了 這可以通過註冊 文件改變通知 事件來實現 然而壹旦檢測到nfig的內容改變 需要通知所有使用了nfig的組件

 那麽問題就來了 Net framework 如何來知道哪些組件使用了nfig 由於註冊機制的缺陷 是不可能做到 進壹步說 實現了所有需要讀取nfig的組件在 Net framework中註冊這個機制 當 Net framework檢測到nfig的改變 它將通知每個註冊組件nfig已改變 那麽組件該現在該如何做呢?

 為了讓nfig新的改變生效 組件不得不重新啟動它自己 這意味著組件需要能夠刷新舊的配置 以及那些基於舊的配置的數據和行為 然後讀取新的配置 並從新的配置開始刷新

 這是不可能的 舉個綁定策略的例子 如果舊的綁定策略認為它需要從裝配件(assembly)A中獲得版本 而新的策略認為它需要從從裝配件(assembly)A中獲得版本 在裝配件(assembly)A的版本 已經加載的情況下 Net framework 無法為新的綁定策略從裝配件(assembly)A中獲得版本

 僅僅只有壹小部分的配置數據可以刷新 這些包括無狀態影響或是影響很容易被消除的配置數據 緩存大小就是壹個好的例子 在緩存大小改變上 妳能重新設置緩存大小 數據仍然保存著 或者簡單移除舊的緩存並開啟壹個新的緩存塊

 通常來說 當nfig發生改變時 確保所有組件壹致性的方法是重啟應用程序 這個方法 Net framework所采用的

 ASP Net有內置的關於nfig發生改變的檢測機制 它在監控nfig上發生的改變 壹旦它檢測到改變 它將關閉舊的應用程序重新啟動新的應用程序

 因此 Net framework將來也不會提供配置數據刷新的特征 如果妳認為這個對於妳很重要 妳必須自己去實現這個

 幸運的是企業庫( Enterprise Library )那幫人理解了這個需求 他們在最新的企業庫版本中開發了個 應用程序配置塊 (Configuration Application Block)

 思路二 如何在不重新啟動客戶端的情況下改變服務器端的地址 總***有兩大類 各有兩種情況

  第壹大類 對於使用代理類

  兩種情況

 ( )不使用身份驗證

 ( )使用身份驗證

 /// <summary>

 /// 調用方案壹

 /// </summary>

 /// <param name= serverAddress >服務器地址</param>

 private static void CallFirstScheme(string serverAddress)

 {

 /*

 /* 方案壹 對於使用代理類 */

 Console WriteLine( 方案壹 );

 // 測試連接(不使用身份驗證)

 Console WriteLine( 創建代理對象 userNamePwdValidator );

 EndpointAddress address = new EndpointAddress( net tcp:// + serverAddress + : /UserNamePwdValidator/UserNamePwdValidatorService );

 UserNamePwdValidatorClient userNamePwdValidator

 = new UserNamePwdValidatorClient( UserNamePwdValidatorService address);

 bool result = userNamePwdValidator Validate(string Empty string Empty);

 Console WriteLine( 測試連接成功 );

 // 驗證用戶名和密碼(與測試連接調用同樣的接口 不使用身份驗證)

 //bool result = userNamePwdValidator Validate( admin admin);

 // 調用服務(使用身份驗證)

 Console WriteLine( 創建服務代理對象 user );

 UserClient user = new UserClient( UserService );

 user Endpoint Address = new EndpointAddress(new Uri( net tcp:// + serverAddress + : /User )

 user Endpoint Address Identity user Endpoint Address Headers);

 user ClientCredentials UserName UserName = admin ;

 user ClientCredentials UserName Password = admin ;

 user Insert();

 Console WriteLine( 調用服務成功 /n );

 /* 方案壹 結束 */

 }

 第二大類 對於使用工廠類

 兩種情況

 ( )不使用身份驗證

 ( )使用身份驗證

 /// <summary>

 /// 調用方案二

 /// </summary>

 /// <param name= serverAddress >服務器地址</param>

 private static void CallSecondScheme(string serverAddress)

 {

 /* 方案二 對於使用工廠類 */

 Console WriteLine( 方案二 );

 // 測試連接(不使用身份驗證)

 Console WriteLine( 創建接口對象 userNamePwdValidator );

 ChannelFactory<WCFContracts IUserNamePwdValidator> channelFactory

 = new ChannelFactory<WCFContracts IUserNamePwdValidator>( Another_UserNamePwdValidatorService );

 channelFactory Endpoint Address = new EndpointAddress( net tcp:// + serverAddress + : /UserNamePwdValidator/UserNamePwdValidatorService );

 WCFContracts IUserNamePwdValidator otherUserNamePwdValidator = channelFactory CreateChannel();

 bool result = otherUserNamePwdValidator Validate(string Empty string Empty);

 Console WriteLine( 測試連接成功 );

 // 驗證用戶名和密碼(與測試連接調用同樣的接口 不使用身份驗證)

 //bool result = userNamePwdValidator Validate( admin admin);

 // 調用服務

 Console WriteLine( 創建接口對象 user );

 ChannelFactory<WCFContracts IUser> otherChannelFactory = new ChannelFactory<WCFContracts IUser>( Another_UserService );

 otherChannelFactory Credentials UserName UserName = admin ;

 otherChannelFactory Credentials UserName Password = admin ;

 otherChannelFactory Endpoint Address = new EndpointAddress(new Uri( net tcp:// + serverAddress + : /User )

 otherChannelFactory Endpoint Address Identity otherChannelFactory Endpoint Address Headers);

 WCFContracts IUser otherUser = otherChannelFactory CreateChannel();

 otherUser Insert();

 Console WriteLine( 調用服務成功 /n );

 /* 方案二 結束 */

 }

 附帶身份驗證

 在VS工具的命令行中

 ( )添加證書

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

 ( )將證書設置成可信任的

lishixinzhi/Article/program/net/201311/13011

  • 上一篇:解檔 歸檔 和 編碼 解碼 的關系
  • 下一篇:PE工程師個人求職簡歷
  • copyright 2024編程學習大全網