1

这是我的应用程序的结构。我有一个在网站根目录运行的 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.

4

2 回答 2

2

我终于找到了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;
}

奇迹般有效。

于 2013-08-27T21:01:37.410 回答
0

这是我最终这样做的方式:

    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;
    }
于 2019-05-23T18:37:12.010 回答