【问题标题】:ASP.NET does not attempt to open web.config file?ASP.NET 不尝试打开 web.config 文件?
【发布时间】:2014-10-15 17:36:50
【问题描述】:

我正在尝试让我的 .aspx 页面从其 web.config 文件中读取。在其他服务器上运行的代码在一台特定服务器上无法按预期运行(涉及的所有机器都是 W2K3 R2 SP2)。

.aspx 的一个 sn-p 是

<body>
    <form id="form1" runat="server">
    <div>
     <asp:Label runat="server" Text="" ID="lblTime" /><br />
    Value of myConfigTest is '<asp:Label ID="lblValue" runat="server" Text=""/>'
    </div>
    </form>
</body>

代码在这里:

using System;
using System.Web.Configuration;

namespace configTestWeb
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            lblTime.Text = DateTime.Now.ToLongTimeString();
            string value = WebConfigurationManager.AppSettings["myConfigTest"];
            lblValue.Text = value;
        }
    }
}

我的 web.config 文件就是这样设置的:

<?xml version="1.0"?>

<configuration>

    <appSettings>
        <add key="myConfigTest" value="This is a test"/>
    </appSettings>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
</configuration>

为了排除故障,我将 ProcMon 设置为在 web.config 上进行过滤并从浏览器中点击该页面。输出是

下午 1:06:04
myConfigTest 的值为 ''

但真正奇怪的是,ProcMon 从未报告过访问该文件的尝试!如果我右键单击 IIS 中的虚拟目录并选择 Properties | ASP.NET |编辑配置我可以看到在 ProcMon 中使用约 65 个条目访问 web.config,并且在 ASP.NET 配置设置对话框中正确报告了 appSetting。

我相信我已经排除了 ACL 的问题
a) 将 .aspx 和 web.config 所在的整个目录树设置为 Everyone |完全权限
b) 如果权限问题,ProcMon 将报告打开文件失败的尝试

无奈之下,我卸载/重新安装了 ASP.NET 4.0。

值得注意的是,从 .exe 读取配置可以在该服务器上完美运行

string value = System.Configuration.ConfigurationManager.AppSettings[key];

此问题出现在多个虚拟目录中。

所以我的问题是,是什么阻止了这台服务器能够读取 web.config 文件?

【问题讨论】:

  • 没有试过这个 - 但我认为 web.config 在 web 应用程序进程启动时被读取(aspnet_wp.exe 在 2k3/IIS6 我认为),然后被应用程序缓存,所以你之后不会看到 ProcMon 访问它。验证:杀死网络应用进程并重新加载浏览器以强制重启。
  • @nothingisnecessary:很好的调用,.config 文件在应用程序启动时被读取。我可以看到我的文件正在被读取,但我仍然没有从文件中获得预期值。

标签: asp.net configuration


【解决方案1】:

与其麻烦地使用 ProcMon,不如尝试做一个更简单的测试:编辑 web.config 文件以启用跟踪功能,然后访问网站并查看它是否显示请求跟踪。

将此添加到web.config 内的system.web 节点:

<trace
    enabled="true"
    requestLimit="10"
    pageOutput="false"
    traceMode="SortByTime"
    localOnly="false"
/>

默认情况下更改web.config(当文件保存/写入磁盘时)将重新启动 ASP.NET 应用程序池。但是,这些选项可以更改,因此如果您在修改 web.config 后没有看到 Web 应用程序行为发生变化,您也可以尝试停止并重新启动服务,或者通过使用任务管理器来触发应用程序池回收来杀死aspnet_wp.exe 进程(我认为这就是它在 2k3 中的名称,如果不尝试 w3wp.exe 代替),然后向 Web 应用程序发出另一个请求(刷新浏览器),它 IIS 应该为你启动应用程序池。

如果更改(在跟踪 enabled=trueenabled=false 之间切换)在保存 web.config 后不可见,但在强制停止/重新启动后可见,则该框上的 IIS 可能没有重新启动应用程序的选项配置更改时的池(我面前没有 2k3,但在 IIS 7 中,它位于 Application Pools > Advanced Options > Recycling > “Disable Recyling for Configuration Changes”下——这是令人讨厌的双重否定选项之一,所以“false”表示配置更改后回收,“true”表示不回收)。

更新: Dang,看起来 IIS6 在应用程序池属性表的回收选项卡中没有“用于配置更改”选项。抱歉,不确定此设置的存储位置,似乎不在 machine.configweb.config 中,所以可能是 IIS 内部用于元数据库的东西(可能是注册表?)

如果您尝试切换跟踪的技巧但没有看到任何效果,您是否确认您正在编辑正确的 web.config 文件?

【讨论】:

  • 我将上述内容添加到我的 web.config 并循环 w3wp.exe 并得到相同的结果,没有任何痕迹。这与我之前在调查中看到的内容相吻合:将 添加到 system.web 并没有让我看到来自远程客户端的详细错误信息。感觉好像连框架都没有读取 web.config 文件。我正在编辑与 .aspx 相同的目录中的 web.config,该目录位于应用程序的根目录中。
  • 我想说另一个测试是在其中一个节点中放置一些虚假属性,因为当应用程序启动并读取文件时,asp.net 会抛出验证异常。但是,是的,听起来你要么没有编辑你认为的文件,要么还有其他一些我不熟悉的问题。您是否尝试创建指向同一文件夹的新虚拟目录/应用程序?
  • 我没有尝试过新的 VD,只是尝试过,没有帮助。至于编辑错误的文件,我新建了一个目录,复制到.aspx和.config文件和bin目录下,然后右键web.config,选择编辑。无法想象弄错了...叹息。
猜你喜欢
  • 2017-04-11
  • 2014-03-11
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多