访问 Asp.Net 核心应用中的 Web.config 设置?
Access Web.config settings in Asp.Net Core App?
我知道 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>
访问设置的代码:
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
是一个可设置的 属性 但是当我尝试时我发现设置它不会改变它的值。很奇怪。
所以虽然我现在知道问题出在哪里,但我似乎找不到解决它的方法。
我找到了解决办法。弄清楚它的关键是意识到 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
属性 没有指向 web.config 文件,而是指向可执行文件 运行 的 exe.config 文件网站。记住,在.net core下,网站运行在自己的进程中,有自己的exe。
因此 .Net 4.x 与 ConfigurationManager 一起使用的配置模型更像是桌面应用程序而不是 4.x Web 应用程序。我的意思是它查看 exe.config 而不是 web.config。
然后我注意到 Asp.Net 核心 Web 项目(使用完整框架)包含一个 app.config 文件,就像桌面应用程序一样。事实证明,如果您将 .net 4.x 应用程序配置设置放入该文件中,它们将在生成 exe 时放置在 exe.config 文件中,无论是用于调试还是用于发布。就像它与 win 表单应用程序一起工作一样。
因此,在面向完整框架的 asp.net 核心 Web 应用程序中使用 ConfigurationManager 的方法是将应用程序设置放在 app.config 文件而不是 web.config 文件中. ConfigurationManager 会发现它们没有问题。
虽然这解释了很多,但它仍然没有提供将这些设置实际放入 web.config 并通过 ConfigurationManager 访问它们的能力。但我开始相信这在 asp.net 核心 Web 应用程序中是不可能的,即使它针对的是完整框架。
当我开始将我的 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>
我也 运行 关注这个问题。经过一些调查和阅读后,您似乎可以手动添加 web.config,但这是为了为 IIS 提供设置(例如身份验证,...)。
对于应用程序设置或自定义设置,您必须使用 appsettings.json 文件和 .Net Core 中的新配置。
我知道 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>
访问设置的代码:
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
是一个可设置的 属性 但是当我尝试时我发现设置它不会改变它的值。很奇怪。
所以虽然我现在知道问题出在哪里,但我似乎找不到解决它的方法。
我找到了解决办法。弄清楚它的关键是意识到 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile
属性 没有指向 web.config 文件,而是指向可执行文件 运行 的 exe.config 文件网站。记住,在.net core下,网站运行在自己的进程中,有自己的exe。
因此 .Net 4.x 与 ConfigurationManager 一起使用的配置模型更像是桌面应用程序而不是 4.x Web 应用程序。我的意思是它查看 exe.config 而不是 web.config。
然后我注意到 Asp.Net 核心 Web 项目(使用完整框架)包含一个 app.config 文件,就像桌面应用程序一样。事实证明,如果您将 .net 4.x 应用程序配置设置放入该文件中,它们将在生成 exe 时放置在 exe.config 文件中,无论是用于调试还是用于发布。就像它与 win 表单应用程序一起工作一样。
因此,在面向完整框架的 asp.net 核心 Web 应用程序中使用 ConfigurationManager 的方法是将应用程序设置放在 app.config 文件而不是 web.config 文件中. ConfigurationManager 会发现它们没有问题。
虽然这解释了很多,但它仍然没有提供将这些设置实际放入 web.config 并通过 ConfigurationManager 访问它们的能力。但我开始相信这在 asp.net 核心 Web 应用程序中是不可能的,即使它针对的是完整框架。
当我开始将我的 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>
我也 运行 关注这个问题。经过一些调查和阅读后,您似乎可以手动添加 web.config,但这是为了为 IIS 提供设置(例如身份验证,...)。
对于应用程序设置或自定义设置,您必须使用 appsettings.json 文件和 .Net Core 中的新配置。