2011-04-21 123 views
3

我有一個WCF數據服務,有一些方法在page_load事件期間異步調用。configSource絕對路徑變通

我需要一個解決方案從腳本或控制檯應用程序調用這些方法(如有必要)。

我創建了一個引用WCF .dll庫的控制檯應用程序。我必須將WCF服務下web.config中的一些配置變量複製到控制檯應用程序下的app.config中。

我想讓app.config自動鏡像web.config,或者以某種方式將控制檯應用程序指向WCF服務web.config。

我的控制檯應用程序和wcf項目在相同的解決方案中彼此相鄰,所以'configSource'屬性不會工作。不允許父目錄或絕對路徑。

有沒有人知道這方面的解決辦法?

+0

什麼配置變量,你需要複製? – BrandonZeider 2011-04-21 19:48:36

+0

我在configSections元素中定義了一個自定義配置節,以及連接字符串。就是這兩個。 – 2011-04-21 19:57:40

回答

3

好的,我不知道你的自定義配置部分是什麼,但是這個類將告訴你如何以編程方式檢索配置節(本例中是system.serviceModel/client),應用程序設置和連接字符串。您應該可以對其進行修改以適應您的需求。

public class ConfigManager 
{ 
    private static readonly ClientSection _clientSection = null; 
    private static readonly AppSettingsSection _appSettingSection = null; 
    private static readonly ConnectionStringsSection _connectionStringSection = null; 
    private const string CONFIG_PATH = @"..\..\..\The rest of your path\web.config"; 

    static ConfigManager() 
    { 
     ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() 
     { 
      ExeConfigFilename = CONFIG_PATH 
     }; 

     Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); 

     _clientSection = config.GetSection("system.serviceModel/client") as ClientSection; 
     _appSettingSection = config.AppSettings; 
     _connectionStringSection = config.ConnectionStrings; 
    } 

    public string GetClientEndpointConfigurationName(Type t) 
    { 
     string contractName = t.FullName; 
     string name = null; 

     foreach (ChannelEndpointElement c in _clientSection.Endpoints) 
     { 
      if (string.Compare(c.Contract, contractName, true) == 0) 
      { 
       name = c.Name; 
       break; 
      } 
     } 

     return name; 
    } 

    public string GetAppSetting(string key) 
    { 
     return _appSettingSection.Settings[key].Value; 
    } 

    public string GetConnectionString(string name) 
    { 
     return _connectionStringSection.ConnectionStrings[name].ConnectionString; 
    } 
} 

用法:

ConfigManager mgr = new ConfigManager(); 

string setting = mgr.GetAppSetting("AppSettingKey"); 
string connectionString = mgr.GetConnectionString("ConnectionStringName"); 
string endpointConfigName = mgr.GetClientEndpointConfigurationName(typeof(IServiceContract)); 
+0

我試過了。這基本上可以用來通過一些絕對路徑給這兩個應用程序相同的配置文件嗎? – 2011-04-21 21:21:31

+0

我從來沒有嘗試過,但我不明白爲什麼不呢?有趣的想法! – BrandonZeider 2011-04-21 21:22:58