【问题标题】:Why does .NET generate two web.config files in an MVC asp.net application?为什么 .NET 在 MVC asp.net 应用程序中生成两个 web.config 文件?
【发布时间】:2026-02-19 01:15:02
【问题描述】:

我是 MVC 3 的新手。使用两个 web.config 文件的原因是什么?

这 2 个 web.config 文件有什么区别,每个文件的用途和功能是什么?

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 web-config


【解决方案1】:

View 有自己的配置。如果您正在处理区域,那么您将了解不止一种配置。

实际上重点是视图的 Web.Config 是用于视图特定的配置,例如阻止对视图的直接访问。

编辑 1: 在 cmets 中询问的更多解释。

web.config 文件存在于 Views 文件夹中,以防止通过控制器以外的任何方式访问您的视图。在 MVC 设计模式中,控制器应该路由请求并将呈现的视图返回给调用客户端。这意味着 localhost9999://Home/Index.cshtml 不应直接访问。

【讨论】:

  • 你能详细解释一下吗?
  • 您好 Datta, web.config 文件存在于 Views 文件夹中,以防止通过控制器以外的任何方式访问您的视图。在 MVC 设计模式中,控制器应该路由请求并将呈现的视图返回给调用客户端。表示 localhost9999://Home/Index.cshtml 不应直接访问。
  • @Sunny_Sid hello Sunny web.config 文件存在于 Views 文件夹中,以防止访问您的视图,您能解释一下这一行吗
【解决方案2】:

这是web.config 文件继承的示例。来自MSDN

您可以在整个应用程序目录中分发 ASP.NET 配置文件,以在继承层次结构中配置 ASP.NET 应用程序。这种结构允许您在适当的目录级别实现应用程序所需的配置详细级别,而不会影响更高目录级别的配置设置。

具体来说,对于 MVC 项目,View 子目录中的web.config 用于剪裁.cshtml / .aspx 文件。您可以使用子文件夹中的web.config 文件来扩展、覆盖和删除从应用程序自己的根目录继承的设置,并进一步提高层次结构,例如高达machine.config

/Views/web.config 中的常见配置包括:

  • 阻止尝试直接访问 razor 和 aspx 视图的请求(这些需要通过适当的路由从控制器提供)。为此类直接请求配置了404 响应,例如

<add path="*" verb="*" type="System.Web.HttpNotFoundHandler"/>
  • 为视图页面设置default import namespaces,否则必须通过using 显式添加。您可以在此处为常用自定义程序集添加命名空间(例如自定义 html 帮助程序扩展),例如

  <namespaces>
    <add namespace="System.Web.Mvc" />
    <add namespace="System.Web.Mvc.Ajax" />
    <add namespace="System.Web.Mvc.Html" />
    ...
  • 为 MVC 配置 anti-xss RequestValidation 过滤器。配置中添加的注释最好地说明了这一点:

<!--
    Enabling request validation in view pages would cause validation to occur
    after the input has already been processed by the controller. By default
    MVC performs request validation before a controller processes the input.
    To change this behavior apply the ValidateInputAttribute to a
    controller or action.
 -->

【讨论】:

  • 如何防止某个web.config从位于上面目录的另一个Web配置中继承所有数据?
  • @AgentFire 你can selectively 使用&lt;clear&gt;&lt;remove&gt; 标签擦除所有或从父配置继承的特定设置
  • @StuartLC thx 但我通过使用location 标签解决了这个问题。
【解决方案3】:

web.config 文件存在于 Views 文件夹中,以防止通过控制器以外的任何方式访问您的视图。在 MVC 设计模式中,控制器应该路由请求并将呈现的视图返回给调用客户端。

表示 localhost9999://Home/Index.cshtml 不应直接访问。

【讨论】:

    【解决方案4】:

    ASP.NET 配置存储在web.config 文件(XML 文件)中。

    这些文件可以出现在 ASP.NET 应用程序的许多目录中。基于您可以使用记事本编辑它们的事实,它们甚至可以在部署之前帮助配置应用程序行为。他们还把你的代码和你的配置数据分开。

    每个web.config 文件都适用于它存在的目录和所有子目录。子目录中的Web.config 文件可用于覆盖父目录的web.config 文件。

    您可以选择使用 location 元素覆盖单个文件或目录。见LINK

    设置继承规则如下。

    首先是 machine.config 文件,通常位于systemroot\Microsoft.NET\Framework\versionNumber\CONFIG\

    在同一目录中存在一个“主”web.config 文件,该文件定义了机器中运行的所有 asp.net 应用程序的设置。

    然后是您的应用程序中存在的 web.config 文件。

    更多信息:

    ASP.NET configuration overview

    ASP.NET Configuration file hierarchy and inheritance

    【讨论】:

      【解决方案5】:

      我想补充一点,/Views 文件夹中的 Web.Config 是一种很好的(如果不是的话)专门为您的视图声明命名空间的方式。在 Web 应用程序中,几乎每个视图都可能获取传递给它的 ViewModel(而不是您的实际模型)。在 @model 之后声明完整的命名空间或具有相同的 @using App.Web.Viewmodels 变得乏味。这样,所有视图模型都自动可用,您必须做额外的工作才能将真实模型纳入范围,然后立即设置一些警报。

      此外,通常一个应用程序可以获得很多专门用于视图的扩展方法(HTML 助手会想到)。在 /Views/Web.Config 中为这个扩展类定义命名空间是有意义的。这样你就永远不会怀疑“为什么 IntelliSense 找不到我的 @Html.ImageLink() 方法??!”

      【讨论】:

      • 我不明白为什么这个答案被标记为对所提问题的回答。我搜索问题并阅读标记的答案,但不明白答案是否相关,但是当我看到其他答案时,我意识到这个答案是对原始答案的补充。请标记正确答案。这很混乱。
      【解决方案6】:

      除了为您的项目分发设置之外,您还可以通过简单的方式在运行时将其转换为发布。一只手在方向盘上。 见:

      Web.config Transformations

      Transformation Syntax

      【讨论】:

        最近更新 更多