2013-08-27 2 views
1

Ниже представлена ​​структура моего приложения. У меня есть веб-приложение 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.

ответ

3

Я, наконец, нашел подходящий способ 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; 
} 

Работает как очарование.

Смежные вопросы