这是 ASP.NET 配置的层次结构。也许这可以帮助理解哪些设置会相互覆盖。
服务器
Machine.config:Machine.config 文件包含服务器上所有 Web 应用程序的 ASP.NET 架构。此文件位于配置合并层次结构的顶部。
根网
Web.config:服务器的 Web.config 文件与 Machine.config 文件存储在同一目录中,并且包含大多数 system.web 配置部分的默认值。在运行时,此文件在配置层次结构中从顶部倒数第二个合并。
网站
Web.config:特定网站的 Web.config 文件包含适用于该网站的设置,并通过该网站的所有 ASP.NET 应用程序和子目录向下继承。
ASP.NET 应用程序根目录
Web.config:特定 ASP.NET 应用程序的 Web.config 文件位于应用程序的根目录中,包含适用于 Web 应用程序并通过其分支中的所有子目录向下继承的设置。
ASP.NET 应用程序子目录
Web.config:应用程序子目录的 Web.config 文件包含应用于此子目录的设置,并通过其分支中的所有子目录向下继承。
客户端应用程序目录
ApplicationName.config:ApplicationName.config 文件包含 Windows 客户端应用程序(不是 Web 应用程序)的设置。
了解哪些 ASP.NET 文件和文件夹是通过文件夹和应用程序继承的,这对于开发和故障排除非常重要。
这是一个简短的摘要:
- web.config 文件一直沿树继承,超过所有应用程序边界。
- global.asax 仅存在于其应用程序中
- /bin 和 /app_{folders} 只存在于他们的应用程序中
因此,这意味着根 web.config 文件中设置的任何内容都将沿用整个站点,即使某些文件夹被标记为应用程序也是如此。
如果 web.config 文件具有对程序集的引用,但子应用程序没有这些程序集,这会变得混乱。例如,假设您在站点的根目录中配置了一个 HTTP 模块,并从站点 web.config 文件中引用。如果您有一个名为 /subfolder 的子应用程序被标记为应用程序,那么 /subfolder 将尝试从 /subfolder/bin 加载 HTTP 处理程序。由于它不存在,因此将引发错误。
有多种方法可以解决这个问题。如果 /subfolder 中不需要 HTTP 处理程序,可能最干净的方法是通过在 /subfolder/web.config 文件中添加子句来“删除”引用。您可以使用 . 以下是如何删除子文件夹中的 HTTP 模块的示例:
<httpModules>
<remove name="ErrorLog"/>
</httpModules>
以下是网站 web.config 的样子:
<httpModules>
<add name="ErrorLog" type="GotDotNet.Elmah.ErrorLogModule, GotDotNet.Elmah, Version=1.0.5527.0, Culture=neutral, PublicKeyToken=978d5e1bd64b33e5" />
</httpModules>print("code sample");