12

我在带有 ASP.NET 网站的测试服务器上遇到了一些麻烦。我搞砸了,让默认网站的主目录指向了错误的位置。当我尝试时:

ConfigurationManager.ConnectionStrings["connectionString"]; 

它返回空值,但是

using System.Web.Configuration;

/* ... */

var rootWebConfig =
    WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

rootWebConfig.ConnectionStrings.ConnectionStrings["connectionString"].ConnectionString;` 

返回正确的连接字符串。

这两种方法有什么区别?

编辑:我真正要问的是,为什么ConfigurationManager当主目录设置错误时该方法会失败,否则会成功,并且WebConfigurationManager无论主目录是否正确设置都会成功?是否还有其他差异,例如关于访问控制的假设?

4

2 回答 2

32

尝试这个:

在您的 ConfigurationManager 语句所在的位置放置一个断点,然后在“立即输出”窗口中运行以下命令 ((ConfigurationSection) ConfigurationManager.GetSection("connectionStrings")).ElementInformation 。我的机器报告Source: "C:\Users\John\Documents\Visual Studio 2008\Projects\StackOverflowCode\WebApplication1\web.config"如下所示。

注意:以下还显示我正在访问 ASP.NET web.config。

{System.Configuration.ElementInformation}
    Errors: {System.Configuration.ConfigurationException[0]}
    IsCollection: true
    IsLocked: false
    IsPresent: true
    LineNumber: 17
    Properties: {System.Configuration.PropertyInformationCollection}
    Source: "C:\\Users\\John\\Documents\\Visual Studio 2008\\Projects\\StackOverflowCode\\WebApplication1\\web.config"
    Type: {Name = "ConnectionStringsSection" FullName = "System.Configuration.ConnectionStringsSection"}
    Validator: {System.Configuration.DefaultValidator}

当我运行时,ConfigurationManager.ConnectionStrings.ElementInformation我得到Source :null这对于我的网络应用程序是正确的。

你得到什么配置源路径???


立即假设

ConfigurationManager.ConnectionStrings["connectionString"];可能会查找不一定与 Web 应用程序的根 web.config 相同的配置位置。可能它正在查看 Windows 目录(例如,在不同的位置或 machine.config)。试图为此找到合适的测试。


每位经理的意图

系统配置。ConfigurationManager可以访问 .NET 配置 XML 格式,这意味着它同时读取:

  • Web 配置(即 ASP.NET 中的 web.config 文件)
  • 和非 Web 配置(例如 app.config 文件 - 独立控制台应用程序、Windows 应用程序等)

并表示配置类型共有的那些方面。这是一个通用的配置管理器。(但是,尽管可以查看这两种类型的配置,但您应该将其用于应用程序配置,因为 Web 管理器专门用于 Web 配置,如下所述......)

系统.Web.配置。WebConfigurationManager做的事情几乎相同,但它是配置管理器的“网络化”版本,提供对 ASP.NET Web 特定配置方面的访问(例如 ASP.NET 中的 web.config 文件)。

相似之处

查看ConfigurationManager.*WebConfigurationManager.*之间的成员相似性

例如,两个管理员都可以访问一个AppSettings属性和一个ConnectionStrings属性。实际上,这两种设置对两种配置都是通用的,甚至位于 XML 文档中的同一级别。

所以有很多相似之处,

行为差异

访问配置:ConfigurationManager 具有打开相对于 EXEC 应用程序的独立应用程序配置(即 Myprogram.EXE 的 App.config)的方法,而 WebConfigurationManager 具有打开相对于它在网站中的 Web 应用程序根目录的 ASP.NET Web 配置的方法。

这是一个基本的app.config (例如,通过ConfigurationManager从磁盘文件夹中的“C:\winapp\app.config”打开)

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings/>
  <connectionStrings/>
</configuration>

这是一个基本的web.config (例如,通过“~”打开,意思是WebConfigurationManager的网站根目录)

<?xml version="1.0"?>
<configuration>  
    <appSettings/>
    <connectionStrings/>

    <system.web>
        <!-- special web settings -->
    </system.web>

</configuration>

注意相似之处。另请注意,Web 配置有一个针对 ASP.NET 的附加system.web元素。

这些管理器位于不同的程序集中。

  • 配置管理器:System.Configuration.dll
  • WebConfigurationManager:System.Web.dll
于 2010-01-13T23:22:07.417 回答
1

第一个类提供对一般客户端配置文件(如 app.config)的访问,第二个类提供对 Web 应用程序文件(如 web.config)的访问。

于 2010-01-13T23:12:21.967 回答