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

Ron*_*n C 35 asp.net asp.net-core-mvc asp.net-core-1.0

我知道asp.net核心有一个非常灵活的新配置系统,这很棒.但是我喜欢从.net 4.x开始的基于web.config的配置系统.例如,可以将注释放在web.config文件中,因为它是一个xml文件.对我而言,值得坚持使用xml,而不是采用闪亮的新json方法.[ 更新:我现在明白json方法也支持文件中的注释.]

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

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

它应该工作正常吗?关于我可能会看到什么的任何想法?

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>
Run Code Online (Sandbox Code Playgroud)

代码访问设置:

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

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

这可以通过查看AppDomain.CurrentDomain.SetupInformation.ConfigurationFile财产来看出.在我的情况下,而不是指向website_folder\web.config它,而是指向website_folder\bin\Debug\net461\win7-x64\wwwGiftOasisResponsive.exe.Configwebsite_folder是包含我的网站的文件夹的路径.

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

所以,虽然我现在看到问题是什么,但我似乎无法找到解决问题的方法.

Ron*_*n C 37

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

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

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

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

在此输入图像描述

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

  • 我一直在撞墙试图解决这个问题.新的Core和完整的.NET Framework的分离是如此模糊,我从来不觉得我知道,我正在使用它,以及它们如何工作. (5认同)
  • 之所以存在project.json是因为VS2015版本的工具使用project.json作为其项目文件,而存在web.config是因为IIS仍然使用它进行配置,即使Asp.Net Core本身本身并没有。但是,Asp.Net Core需要它来配置适当的IIS模块以运行Asp.Net Core。在Asp.Net核心中,appsettings.json是应用程序配置信息的存储位置,而不是web.config。看起来好像是一团混乱,但实际上只是要熟悉每个部件的用途。希望能有所帮助。 (2认同)
  • 这个解决方案对我有用。我将设置移至 app.config 文件,现在它可以工作了。谢谢! (2认同)

Yus*_*sh0 5

当我开始将我的 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>
Run Code Online (Sandbox Code Playgroud)