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

时间:2016-10-21 22:47:12

标签: 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(至少在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是包含我的网站的文件夹的路径。

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

因此,虽然我现在看到问题所在但我似乎无法找到解决问题的方法。

3 个答案:

答案 0 :(得分:33)

我找到了解决方案。解决问题的关键是意识到$(function () { function viewButton(cellvalue, options, rowObject) { return "<button class=\"viewLineItem\" id=\"" + options.rowId + "\">View Line Item</button>"; } $("#grid").jqGrid({ url: "/Location/LocationsList1", datatype: 'json', colNames: ['Id', 'Country Name', 'State Name', 'City Name', 'Location Name','View'], colModel: [ { name: 'CountryName' }, { name: 'StateName' }, { name: 'CityName' }, { name: 'Name' }, { name: 'View', editable: false, formatter: viewButton } ], cmTemplate: { editable: true }, pager: '#pager', rowNum: 10, rowList: [10, 20, 30, 40], height: '100%', viewrecords: true, caption: 'Location', emptyrecords: 'No records to display', jsonReader: { repeatitems: false, id: "Id" }, beforeSelectRow: function (rowid, e) { var $td = $(e.target).closest("tr.jqgrow>td"), p = $(this).jqGrid("getGridParam"); if ($td.length > 0 && p.colModel[$td[0].cellIndex].name === "View") { alert(rowid); } } }); }); 属性没有指向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会发现没问题。

enter image description here

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

答案 1 :(得分:3)

当我开始将我的asp.net核心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>

答案 2 :(得分:2)

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

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

Microsoft Documentation