我最近将一个 ASP.Net Web API 项目部署到我们的 Azure App Service 测试槽,但在向 API 端点发出请求时开始收到错误消息。通过远程调试,很明显该应用程序正在从部署的web.config
文件中提取我的开发连接字符串。
连接字符串应该来自我们通过 Azure 门户设置的应用程序设置 - 在以前的部署中,它们是 - 但事实并非如此。
为什么会发生这种情况以及可以做些什么来确保发生正确的行为?我们绝对不希望我们的生产数据库机密通过web.config
...
我最近将一个 ASP.Net Web API 项目部署到我们的 Azure App Service 测试槽,但在向 API 端点发出请求时开始收到错误消息。通过远程调试,很明显该应用程序正在从部署的web.config
文件中提取我的开发连接字符串。
连接字符串应该来自我们通过 Azure 门户设置的应用程序设置 - 在以前的部署中,它们是 - 但事实并非如此。
为什么会发生这种情况以及可以做些什么来确保发生正确的行为?我们绝对不希望我们的生产数据库机密通过web.config
...
我最近遇到了同样的问题并修复了它:
在 Azure 应用服务中,计算机范围的web.config
文件位于D:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
.
这个文件不同于普通的机器范围web.config
文件,因为它有这个额外的元素:
<system.web>
...
<compilation>
<assemblies>
<add assembly="EnvSettings, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
...
</assemblies>
</compilation>
</system.web>
该EnvSettings.dll
程序集位于内部D:\Program Files\IIS\Microsoft Web Hosting Framework
(不幸的是,该目录是受访问控制的,我无法进入它)。
EnvSettings.dll
有镜像,所以我可以从那里复制它。内部EnvSettings.dll
是一个[assembly: PreApplicationStartMethod]
属性,它运行一种方法,在EnvSettings.dll
该方法中,APPSETTING_
将环境变量中的数据库连接字符串设置复制到 .NET FrameworkConfigurationManager.AppSettings
和ConfigurationManager.ConnectionStrings
集合中。
AppDomain
- 因此,如果您AppDomain
的应用程序中有其他实例,他们将看不到更新的ConfigurationManager
.因此,如果您在转储 时发现应用服务的 Azure 门户配置设置未使用ConfigurationManager
,则可能会发生以下情况:
<clear />
在你的<compilation><assemblies>
元素中使用了,它EnvSettings.dll
根本不会被加载。
<add assembly="EnvSettings...
上面的元素添加回您自己的元素web.config
,或者找到其他方式来加载它。
EnvSettings.dll
在本地保存并向您的项目添加程序集引用,因为这EnvSettings.dll
是 Microsoft Web Hosting Framework 的一部分。ConfigurationManager
后正在清除或重置。EnvSettings
作为EnvSettings.dll
复制您的设置的替代方法,另一种选择是将环境变量复制到自己身上——当您控制执行此操作的代码时,这意味着您可以在需要时调用它(例如,如果您曾经重置它们)。
这是我使用的代码:
public static class AzureAppSettingsConfigurationLoader
{
public static void Apply()
{
foreach( DictionaryEntry environmentVariable in Environment.GetEnvironmentVariables() )
{
String name = (String)environmentVariable.Key;
String value = (String)environmentVariable.Value;
if( name.StartsWith( "APPSETTING_", StringComparison.OrdinalIgnoreCase ) )
{
String appSettingName = name.Substring( "APPSETTING_".Length );
ConfigurationManager.AppSettings[ appSettingName ] = value;
}
else if( name.StartsWith( "SQLAZURECONNSTR_", StringComparison.OrdinalIgnoreCase ) )
{
String csName = name.Substring( "SQLAZURECONNSTR_".Length );
ConfigurationManager.ConnectionStrings.Add( new ConnectionStringSettings( csName, value, providerName: ""System.Data.SqlClient" ) );
}
}
}
}
在此处查看我的示例:http: //mvc5appsettings.azurewebsites.net/
// My web.config also has a "HERO_TEXT" key in
// that reads "Value from web.config"
string hero = ConfigurationManager.AppSettings["HERO_TEXT"];
.NET 应用程序设置的 Wiki 页面:
https ://github.com/projectkudu/kudu/wiki/Managing-settings-and-secrets
正如这里已经提到的,请确保您在正确的插槽中拥有该应用程序设置。
据我所知,Azure 门户中的设置将覆盖 Web.config 中的现有设置。因此,如果您想忽略门户中的 Azure 应用程序设置并改用 Web.config。恐怕您需要在 web.config 中配置设置,并在 Azure 门户中删除相同的密钥/对。