configSource绝对路径解决方法

时间:2011-04-21 18:16:19

标签: c# wcf configuration web-config app-config

我有一个WCF数据服务,其中包含一些我在page_load事件期间异步调用的方法。

如果需要,我需要一个解决方案来从脚本或控制台应用程序中调用这些方法。

我创建了一个引用WCF .dll库的控制台应用程序。我必须将WCF服务下的web.config中的一些配置变量复制到控制台应用程序下的app.config中。

我希望app.config自动镜像web.config,或者以某种方式将控制台应用程序指向WCF服务web.config。

我的控制台应用程序和wcf项目在同一解决方案中彼此相邻,因此'configSource'属性不起作用。不允许父目录或绝对路径。

有没有人知道这方面的解决方法?

1 个答案:

答案 0 :(得分: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));