【问题标题】:Trying to understand the new behavior of appsettings.json vs web.config in .NET Core but confused by contradictory information on MSDN试图了解 .NET Core 中 appsettings.json 与 web.config 的新行为,但被 MSDN 上相互矛盾的信息弄糊涂了
【发布时间】:2017-09-26 04:00:11
【问题描述】:

所以,我正在阅读 MSDN 上的所有 .NET Core Fundamentals 文章,同时在 Visual Studio 2017 中研究一个新的 .NET Core MVC 应用程序。我在文章以及我在应用程序中看到的内容。我希望有人能帮助我理解。

因此,我了解到,在 Visual Studio 中创建的新 .NET Core 项目默认配置为使用 Kestrel Web 服务器和 IIS Express Web 服务器,在开发中运行时充当反向代理。

我还了解到 ASP.NET Core 模块与 IIS 管道挂钩,除其他外,它会将流量重定向到您的 .NET Core Web 应用程序。

这就是我要挂断的内容。

来自关于 .NET Core 配置的 MSDN 文章:

web.config 文件 在 IIS > 或 IIS-Express 中托管应用程序时需要 web.config 文件。 web.config 打开 IIS 中的 AspNetCoreModule 以启动您的 >app。 web.config 中的设置启用 > IIS 中的 AspNetCoreModule 以启动您的 > 应用程序并配置其他 IIS 设置和模块。如果您使用 Visual >Studio 并删除 web.config,Visual Studio 将创建一个新的。

我的印象是,在 .NET Core 中,应用程序配置已从 web.config 文件中移出,而是通过许多不同的机制进行控制,其中之一就是 appsettings.json 文件。事实上,在 Visual Studio 中创建新的 .NET Core MVC 应用程序甚至不会在我的解决方案目录中创建 web.config 文件。

但是从上面引用的文章看来,ASP.NET Core Module 好像还是通过web.config 文件来配置的?令人困惑的是,文章说 Visual Studio 会为我创建一个 web.config 文件,如果不存在的话,但我已经运行了几次应用程序,并没有看到任何地方创建了 web.config 文件。

让我更困惑的是 MSDN ASP.NET Core 模块参考文章中看似矛盾的信息:

ASP.NET Core 模块通过站点或应用程序 web.config 文件进行配置 >并且在 system.webServer 中有自己的 aspNetCore 配置部分。 >这是一个示例 web.config 文件,Microsoft.NET.Sdk.Web SDK 将在项目发布时为依赖于框架的部署提供 >占位符用于 processPath 和参数:

等等 - 这说明发布我的应用程序的行为是创建 web.config 文件的原因。

那么只有完整的 IIS 需要 web.config 文件吗?如果没有提供 web.config,也许 IIS Express 和 IIS 都可以使用默认行为,但如果我想覆盖默认行为,我需要一个 web.config 文件?

是否有人对这一切在 .NET Core 中的工作原理有深入的了解并愿意让我直截了当?

【问题讨论】:

  • 我相信需要一个 web.config 来配置 kestrel 服务器周围的包装器,这允许输入/输出通过 IIS 管道传输到 dotnetcore。所以答案是,如果您使用 IIS,则两者都需要。
  • 我不确定这是不是真的,因为我的应用程序运行没有问题,而且我的解决方案中没有任何 web.config。
  • 那你的抱怨是什么?
  • 我强烈反对Programming By Coincidence,所以当我阅读我上面发布的不一致/含糊/误导性的文档时,我会尽力消除我的误解。换句话说,“它有效,所以不用担心”是不够的。

标签: .net


【解决方案1】:

Bloog,您现在可能已经找到了答案 - 但我想在这里发表评论以防万一以及其他任何研究此问题的人。

据我了解,web.config 也不再是 ASP.net Core Web 应用程序的一部分。而且,正如您所说,在创建新的 ASP.net Core Web 应用程序项目时 - 我的项目中也没有 web.config 文件。但是,当我将应用程序发布到基于 IIS 的 Web 主机时 - 主机系统上 Web 应用程序文件夹的根目录中有一个 web.config 文件。

经过大量研究,在我看来,这不是同一意义上的“web.config”文件——它被用作红隼服务器运行的环境“包装器”的配置文件。我在该文件的 部分下的 部分中找到了多种配置数据库连接字符串的解释。我还使用 IIS Manager for Remote Administration 在我的托管服务上配置 IIS 设置。特别是一项设置是对我们的 IP 限制,以阻止除我的 IP 之外的任何地方的用户访问我的测试站点。我会对其进行配置,然后对其进行测试,它运行良好,但是当我进行一些更改并重新发布我的网站时 - 此设置将回到未配置状态。

好吧,我再次重新配置它,然后去在 web.config 文件中设置一些数据库连接字符串,但是我打开它,我看到 web.config 文件中添加了一个带有我的 IIS IP 限制的部分那里也有设置!嗯!

所以,我再次重新发布了该站点,然后再次重新检查了 web.config 文件...没有 IP 限制设置!所以 IIS 配置直接修改了这个 web.config 文件。同样,我重新配置了我的 IP 限制,然后复制了这个 web.config 文件并将其添加到我的 Visual Studio 项目中。现在,当我重新发布时 - 此文件也已发布,并且保留了我的 IP 限制。

当您查看这个 web.config 文件的结构时,似乎其中唯一的东西与 IIS 环境有关,所以我认为它实际上就像一个 IIS 配置文件并帮助创建几乎用于运行红隼服务器的简单虚拟服务器环境。在我的情况下,我在共享托管服务器上托管,所以我无法访问我自己的环境变量,每个人都建议为核心项目放置数据库连接字符串 - 但是这个 web.config 文件似乎正在获取这些环境变量和 IIS 设置并将它们应用到 kestrel 正在运行的包装器中。

我不能说它可以做什么——尤其是与它在 ASP.NET 项目中的原始功能相比——但我认为——它似乎与它几乎没有任何共同之处。如果他们将其称为 environment.config 或 server.config 或...这将非常适合我。将 web.config 文件的两次迭代混为一谈,就像这样。

我仍在对此进行测试 - 但它正在影响 Visual Studio 中的 IIS Express。目前,我收到“无法启动进程 C:\Program Files\dotnet\dotnet.exe。Web 服务器请求失败,状态码为 500,内部服务器错误。完整响应已写入 C:\Users\mywindowsuseracct \AppDate\Local\Temp\HTTPFailure_12-52-15.html" 当我开始我的项目时 - 但是,如果我只是在 VS 项目中更改 web.config 文件的名称,那么它运行良好。我会说这是因为这个 web.config 告诉 IIS 在哪里运行 aspNetCore 项目 dll,它当前基于文件在主机服务器上的位置与 VS IIS Express。

所以我认为下一步将尝试查看如何在发布到主机时仅在发布模式下发布此文件 - 并且在开发模式下在 IIS Express 中运行时被忽略。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2019-01-12
    • 1970-01-01
    • 2014-08-14
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多