wcf从不同的配置文件加载

时间:2011-03-02 17:03:46

标签: wcf app-config

我正在尝试在与应用程序启动路径不同的路径中使用应用程序配置文件。我发现我可以用以下命令更改配置文件名:

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字段具有正确的文件名。我使用了愚蠢的代码来反映2个字段的值和正确的wortk,从新的配置文件中加载服务:

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);

现在我想知道是否有其他方法可以这样做,或者是AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE"是不够的错误,还是其他任何建议。

由于

1 个答案:

答案 0 :(得分:0)

如果要使用至少一个双工操作,请考虑实施自定义ServiceHostChannelFactory<TChannel>(和DuplexChannelFactory<TChannel>

您可以将Configuration类实例传递给它们的构造函数,并在必要时使用通过该实例检索的相关部分。

这可能需要比你已经完成的工作更多的工作,但代码肯定会更加整洁,如下所示:

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