Откройте файл 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;
}