Ниже представлена структура моего приложения. У меня есть веб-приложение asp.net, работающее в корневом каталоге веб-сайта. В дочернем каталоге у меня есть WebServices\MyWCFService\
. Изложенные здесь:Открыть файл web.config родительского веб-приложения из дочернего WCF-сервиса
\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;
Теперь apperently открыть конфигурационный файл, вы должны использовать виртуальный путь (вместо пути локальной файловой системы), как так:
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
всегда имеет значение null, поэтому я не могу использовать его метод Request
, чтобы получить виртуальный путь таким образом. То же самое касается Server.MapPath
. Есть идеи? Я не против этого по-другому, так как в конечном счете я могу открыть родительское приложение web.config
.