在 Asp.Net Core App 中访问 Web.config 设置?

Posted

技术标签:

【中文标题】在 Asp.Net Core App 中访问 Web.config 设置?【英文标题】:Access Web.config settings in Asp.Net Core App? 【发布时间】:2016-10-21 22:47:12 【问题描述】:

我了解 asp.net core 有一个新的配置系统,它非常灵活,非常棒。但是我喜欢 .net 4.x 中基于 web.config 的配置系统。例如,可以将 cmets 放在 web.config 文件中,因为它是一个 xml 文件。这对我来说值得坚持使用 xml 而不是使用闪亮的新 json 方法。 [更新:我现在明白json方法也支持文件中的cmets。]

所以,如果我有一个针对完整框架的 Asp.Net Core Web 项目,我似乎应该能够使用基于 web.config 的 System.Configuration.ConfigurationManager.AppSettings[key] 方法来获取设置。

但是当我尝试时,该值总是返回 null(至少在 IIS express 使用 VS2015 时)。

它应该可以正常工作吗?对我可能会过度关注的内容有什么想法吗?

Web.config

<configuration>
    <appSettings>
        <add key="SomeSetting" value="true"/>
    </appSettings>

    <system.webServer>
        <handlers>
            <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
        </handlers>

        <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
     </system.webServer>
</configuration>

访问设置的代码:

string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
       throw new Exception("The required configuration key " + key + " is missing. ");

更新 经过更多研究,我现在明白为什么它不起作用,但我仍然没有找到解决它的方法。根本原因似乎是 ConfigurationManager 在不同的文件中而不是在 web.config 中查找配置信息。

这可以通过查看AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 属性来查看。在我的例子中,它不是指向website_folder\web.config,而是指向website_folder\bin\Debug\net461\win7-x64\wwwGiftOasisResponsive.exe.Config,其中 website_folder 是包含我的网站的文件夹的路径。

文档和智能感知说AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 是一个可设置的属性,但是当我尝试时,我发现设置它并不会改变它的值。很奇怪。

所以,虽然我现在看到了问题所在,但我似乎找不到解决方法。

【问题讨论】:

您可以使用 .xml 而不是 .json 并使用 XmlConfigurationProvider 也许我错了,但我得到的印象是您认为无法在 json 配置文件中进行注释。 Microsoft.Extensions.Configuration.Json 支持 cmets。 @tmg- 谢谢,这是一个很好的后备计划,我会研究一下。不过,我不明白为什么不能使用 ConfigurationManager 从 web.config 获取值... 我找不到它的文档,但在这个问题 (github.com/aspnet/Configuration/issues/87) 中,最后一条评论说:“现在单行和多行 cmets 都适用于 json 文件。”并在此处查看测试:github.com/aspnet/Configuration/blob/release/test/… 在第 65 行查找“SupportAndIgnoreComments”。 @RandyVanElburg - 我已经验证 appsettings.json 实际上支持 cmets。我真的感谢您指出这个给我。最后,由于这种洞察力,我将利用新的 .net 核心配置系统。谢谢。 【参考方案1】:

我找到了解决方案。弄清楚它的关键是意识到AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 属性不是指向web.config 文件,而是指向运行网站的可执行文件的exe.config 文件。请记住,在 .net core 下,网站运行在自己的进程中,并且有自己的 exe。

因此 .Net 4.x 与 ConfigurationManager 一起使用的配置模型更像是桌面应用程序,而不是 4.x Web 应用程序。我的意思是它正在查看 exe.config 而不是 web.config。

然后我注意到 Asp.Net Core Web 项目(使用完整的框架)包含一个 app.config 文件,就像桌面应用程序一样。事实证明,如果您将 .net 4.x 应用程序配置设置放在该文件中,它们将在生成 exe 时放置在 exe.config 文件中,无论是用于调试还是发布。就像它与例如 win forms 应用程序一样。

因此,在面向完整框架的 asp.net 核心 Web 应用程序中使用 ConfigurationManager 的方法是将应用程序设置放在 app.config 文件中,而不是 web.config 文件中。 ConfigurationManager 会发现它们没有问题。

虽然这解释了很多,但它仍然没有提供将这些设置实际放入 web.config 并通过 ConfigurationManager 访问它们的能力。但我开始相信在 asp.net 核心 Web 应用程序中这是不可能的,即使它针对的是完整框架。

【讨论】:

我一直在用头撞墙试图弄清楚这一点。新的 Core 和完整的 .NET Framework 的分离是如此模糊,我从不觉得我知道我在使用什么,以及它们是如何工作的。 我听到了。查看命名空间会有所帮助。即 Microsoft.AspNetCore 命名空间中的东西是核心的一部分。如果您的目标是完整框架,则主要规则是远离 System.Web.HttpContext 对象和所有子对象(它的请求、响应、cookie 等对象) project.json 存在是因为 VS2015 版本工具使用 project.json 作为项目文件,web.config 存在是因为 IIS 仍然使用它进行配置,即使 Asp.Net Core 不支持瑟。但是,Asp.Net Core 需要它来配置正确的 IIS 模块以运行 Asp.Net Core。在 Asp.Net 核心中,appsettings.json 是应用程序配置信息的存储位置,而不是 web.config。它看起来像是一团糟,但实际上这只是一个熟悉每个部件现在用途的问题。希望对您有所帮助。 哦,我明白为什么这些片段都在那里,但我不明白为什么,当我开始一个完整的 .NET 解决方案时,它使用了一些“旧的”.NET 约定,还有一些新的 Asp.Net Core 约定。例如,我没有得到 appsettings.json。 这个解决方案对我有用。我将设置移到 app.config 文件中,现在它可以工作了。谢谢!【参考方案2】:

当我开始将我的 asp.net core 1.1 应用程序发布到 IIS 时,我遇到了这个问题。 将在 IIS 上生成 web.config 文件,该文件在发布时被覆盖。要启用 Windows 身份验证,我必须手动添加 web.config 到我的项目中。这个被正确发布到 IIS:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\yourproject.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <authentication>
        <anonymousAuthentication enabled="false" />
        <windowsAuthentication enabled="true" />
      </authentication>
    </security>
  </system.webServer>
</configuration>

【讨论】:

您是否需要对您的项目代码(例如 Startup.cs)进行任何调整?还是 appsettings.json? 不,它会自动发布到 IIS。但必须重命名才能调试。 当我发布到 IIS 时,web.config 没有被复制......它会生成一个新的。我用msdeploy.exe部署,有参数要加吗?【参考方案3】:

我也遇到了这个问题。经过一番调查和阅读,您可以手动添加 web.config,但这是为 IIS 提供设置(例如身份验证,...)。

对于 appsettings 或自定义设置,您必须使用 appsettings.json 文件和 .Net Core 中的新配置。

Microsoft Documentation

【讨论】:

以上是关于在 Asp.Net Core App 中访问 Web.config 设置?的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core全局目录重定向,根目录/设置访问内容

Asp.Net Core App 部署故障示例

ASP.NET Core Blazor 设置路径前缀(pathPrefix)

asp.net core下载文件支持配置,上传文件访问支持下载

asp.net core下载文件支持配置,上传文件访问支持下载

007.Adding a view to an ASP.NET Core MVC app -- 在asp.net core mvc中添加视图