Откройте файл web.config родительского веб-приложения из дочерней службы WCF.

Вот структура моего приложения. У меня есть веб-приложение asp.net, работающее в корне сайта. В дочернем каталоге у меня есть WebServices\MyWCFService\, Обрисовано здесь:

\parentapp\
\parentapp\App_Data\
\parentapp\Web.config
\parentapp\other_parent_stuff
\parentapp\WebServices\
\parentapp\WebServices\MyWCFService\
\parentapp\WebServices\MyWCFService\bin\
\parentapp\WebServices\MyWCFService\bin\MyWCFService.dll
\parentapp\WebServices\MyWCFService\Web.config (WCF's .config)
\parentapp\WebServices\MyWCFService\other_wcf_stuff

В конечном итоге мне нужно открыть корневое приложение. web.config чтобы получить строки подключения, чтобы служба WCF могла подключиться к предоставленной там информации базы данных. От WCF я могу получить свой собственный web.config, но мне нужно зайти в корень сайта, чтобы получить это web.config, Я получаю корневой каталог, выполнив это:

string svcDir = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
DirectoryInfo rootDir = Directory.GetParent(svcDir).Parent.Parent;
string root = rootDir.FullName;

Теперь, чтобы открыть файл конфигурации, вам нужно использовать виртуальный путь (вместо пути локальной файловой системы), например:

VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(root, true);
WebConfigurationFileMap wcfm = new WebConfigurationFileMap();
wcfm.VirtualDirectories.Add("/", vdm);
Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");

И оттуда, я должен иметь возможность получить доступ к строке подключения, вызвав config.ConnectionStrings.ConnectionStrings["db_name"],

Проблема в том, что я никогда не смогу пройти объявление конфигурации, где я получаю ArgumentOfOfRangeException, Это ожидалось во время тестирования, так как root указывает на мою папку VS Projects в C:\\Users\\me\\Documents\\Visual Studio 2012\\Projects, Итак, я бросил тест web.config файл там, но я все еще получаю исключение. На производственных серверах путь будет указывать на корневую папку родительского приложения, которая содержит файл конфигурации.

Кроме того, имейте в виду, что в Службе WCF HttpContext.Current всегда нулевой, поэтому я не могу использовать его Request способ получить виртуальный путь таким образом. То же самое касается Server.MapPath, Есть идеи? Я не против того, чтобы делать это по-другому, если в конечном итоге я могу открыть родительское приложение. web.config,

1 ответ

Решение

Я наконец нашел правильное ConfigurationManger Метод для использования в этом случае, когда виртуальный путь не требуется. Вот код:

//web config subfolder and filename
const string WEB_CONFIG = "\\Web.config";

//open parent application's web.config file to get connection string to specific database
string svcDir = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
DirectoryInfo rootDir = Directory.GetParent(svcDir).Parent.Parent;
string root = rootDir.FullName;
string webconfigPath = root + WEB_CONFIG;

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = webconfigPath;
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

string connectionString = "";
if (configuration.ConnectionStrings.ConnectionStrings["db_name"].ConnectionString.Length > 0)
{
    connectionString = configuration.ConnectionStrings.ConnectionStrings["db_name"].ConnectionString;
}

Работает как шарм.

Вот как я это сделал:

    public string GetConnectionStringValueFromParent(string key)
    {
        string value = string.Empty;
        try
        {
            const string WEB_CONFIG = "\\Web.config";

            string svcDir = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
            DirectoryInfo rootDir = Directory.GetParent(svcDir).Parent;
            string root = rootDir.FullName;
            string webconfigPath = root + WEB_CONFIG;

            ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
            fileMap.ExeConfigFilename = webconfigPath;
            Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

            if (configuration.ConnectionStrings.ConnectionStrings[key].ConnectionString.Length > 0)
            {
                value = configuration.ConnectionStrings.ConnectionStrings[key].ConnectionString;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        return value;
    }
Другие вопросы по тегам