是否访问Asp.Net核心应用程序中的Web.config设置?

是否访问Asp.Net核心应用程序中的Web.config设置?,asp.net,asp.net-core-mvc,asp.net-core-1.0,Asp.net,Asp.net Core Mvc,Asp.net Core 1.0,我知道asp.net core有一个非常灵活的新配置系统,这很好。但是我喜欢.NET4.x中基于web.config的配置系统。例如,可以在web.config文件中添加注释,因为它是一个xml文件。这对我来说值得坚持使用xml,而不是使用全新的json方法。[更新:我现在知道json方法也支持文件中的注释。] 因此,如果我有一个针对整个框架的Asp.Net核心Web项目,那么我似乎应该能够使用基于Web.config的System.Configuration.ConfigurationMana

我知道asp.net core有一个非常灵活的新配置系统,这很好。但是我喜欢.NET4.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

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

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

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


因此,虽然我现在明白了问题所在,但似乎找不到解决问题的方法。

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

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

然后我注意到Asp.Net核心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 core web应用程序中,即使它针对的是完整的框架,这也是不可能的。

当我开始将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>

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

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


您可以使用.xml而不是.json,并使用XmlConfigurationProviderMaybe,因为我错了,但我得到的印象是,您认为不可能在json配置文件中进行注释。Microsoft.Extensions.Configuration.Json支持注释。@tmg-谢谢,这是一个很好的后备计划,我将研究它。不过,我不明白为什么ConfigurationManager不能用于从web.config获取值……我在文档中找不到它,但在本期()中,最后一条评论说:“现在单行和多行注释都可以在json文件上使用。”看看这里的测试:在第65行查找“SupportAndIgonomments”。@RandyVanElburg-我已经验证了appsettings.json实际上支持注释。我真的很感激你把这个指给我看。最后,基于这一观点,我将利用新的.net核心配置系统。谢谢你。我一直在努力想办法解决这个问题。新的核心和完整的.NET框架的分离是如此模糊,我从来没有感觉到我知道我在用什么,以及它们是如何工作的。我听到了。查看名称空间会有所帮助。i、 e.Microsoft.AspNetCore命名空间中的内容是core的一部分。如果您针对的是完整的框架,主要规则是远离System.Web.HttpContext对象和所有子对象(它的请求、响应、cookies等对象),project.json就在那里,因为版本VS2015工具使用project.json作为它的项目文件,之所以有web.config,是因为即使Asp.Net核心本身不使用,IIS仍使用它进行配置。但是,Asp.Net Core需要它来配置适当的IIS模块以运行Asp.Net Core。在Asp.Net core中,appsettings.json是存储应用程序配置信息的位置,而不是
string key = "SomeSetting";
string setting = ConfigurationManager.AppSettings[key];
if (setting == null)
       throw new Exception("The required configuration key " + key + " is missing. ");
<?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>