2011-03-02 6 views
0

アプリケーションの起動パスとは異なるパスでアプリケーションの設定ファイルを使用しようとしています。私は設定ファイル名を以下のように変更することができます:wcfが別の設定ファイルからロードされました

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename); 

この後いくつかの方法が正しく動作します。 ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)は正しいファイルをロードし、他のメソッドは動作しません。 ConfigurationManager.GetSection("system.serviceModel/client")はファイルからセクションをロードしません。

設定ファイルを使用してサービスまたはチャネルファクトリを作成する必要があるため、これが見つかりました。書き込み:

channelFactory = new ChannelFactory<TContract>(EndpointConfigurationName); 

内部コードがGetSectionメソッドを使用していると思いますが、クラッシュしました。私はConfigurationManagerクラスのプライベートフィールドを調べ、ClientConfigPathsのインスタンスに_applicationCongiUriフィールドの古い設定ファイル名があり、静的なs_currentフィールドに正しいファイル名があることがわかりました。私はそうする他の方法があるかどうかを知りたいのですが今

AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", NewConfigFullFilename); 
FieldInfo field = typeof(ConfigurationManager).GetField("s_initLock", BindingFlags.Static | BindingFlags.NonPublic); 
object lockobj = field.GetValue(null); 
lock (lockobj) 
{ 
    typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0); 
} 
field = typeof(ConfigurationManager).GetField("s_configSystem", BindingFlags.Static | BindingFlags.NonPublic); 
object s_configSystem = field.GetValue(null); 
field = s_configSystem.GetType().GetField("_configHost", BindingFlags.Instance | BindingFlags.NonPublic); 
object _configHost = field.GetValue(s_configSystem); 
field = _configHost.GetType().GetField("_configPaths", BindingFlags.Instance | BindingFlags.NonPublic); 
object _configPaths = field.GetValue(_configHost); 
field = _configPaths.GetType().GetField("_applicationConfigUri", BindingFlags.Instance | BindingFlags.NonPublic); 
field.SetValue(_configPaths, NewConfigFullFilename); 
field = _configPaths.GetType().GetField("_localConfigFilename", BindingFlags.Instance | BindingFlags.NonPublic); 
field.SetValue(_configPaths, NewConfigFullFilename); 

:私は、新しい設定ファイルからサービスをロードし、正しく反映して2つのフィールドの値と、このwortkを変更するにはfoolowingコードを使用しましたまたはそれがAppDomain.CurrentDomain.SetData("APP_CONFIG_FILE"で十分でないバグ、または他の提案がある場合。

おかげ

答えて

0

(使用する少なくとも一つの二重操作がある場合とDuplexChannelFactory<TChannel>)カスタムServiceHostChannelFactory<TChannel>の実装を検討。

クラスインスタンスをコンストラクタに渡し、必要に応じてインスタンスを介して取得した関連セクションを使用できます。

これは、あなたがすでに行っているよりも多くの作業が必要になることがありますが、コードは確かにこのようなもので、より滑らかな印象になります:

// Use path to relevant configuration file 
string configPath = null; 
Configuration config = ConfigurationManager.OpenExeConfiguration(configPath); 
CustomServiceHost host = new CustomServiceHost(typeof(Service), config); 
host.Open(); 
関連する問題