这是我的应用程序的结构。我有一个在网站根目录运行的 asp.net Web 应用程序。在我的子目录中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
始终为 null,因此我不能使用它的Request
方法以这种方式获取虚拟路径。也一样Server.MapPath
。有任何想法吗?我不反对以不同的方式进行此操作,只要最终我可以打开父应用程序的web.config
.