我最近将ASP.Net Web API项目部署到我们的Azure App Service测试槽,但在向API端点发出请求时开始收到错误。通过远程调试,很明显该应用程序正在从部署的web.config
文件中提取我的开发连接字符串。
连接字符串假设来自我们通过Azure门户设置的应用程序设置 - 而且,在以前的部署中,它们是 - 但事实并非如此。
为什么会发生这种情况以及可以采取哪些措施来确保发生正确的行为?我们绝对不希望我们的生产数据库机密通过web.config
...
答案 0 :(得分:1)
我最近遇到了相同的问题,并已解决:
在Azure App Services中,计算机范围的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
反映在GAC中,因此我可以从那里复制它。内部EnvSettings.dll
是一个[assembly: PreApplicationStartMethod]
属性,该属性在EnvSettings.dll
中运行一个方法,该方法将APPSETTING_
和数据库连接字符串设置从环境变量复制到.NET中框架ConfigurationManager.AppSettings
和ConfigurationManager.ConnectionStrings
集合。
AppDomain
个中进行-因此,如果您的应用程序中还有其他AppDomain
个实例,则不会看不到更新后的ConfigurationManager
。因此,如果在转储ConfigurationManager
时看到未使用App Service的Azure Portal配置设置,则可能发生以下情况:
<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" ) );
}
}
}
}
答案 1 :(得分:0)
请在此处查看我的示例: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
如前所述,请确保您在正确的插槽中安装了该应用设置。
答案 2 :(得分:-1)
据我所知,Azure门户中的设置将覆盖Web.config中的现有设置。因此,如果要忽略门户中的Azure应用程序设置并使用Web.config。我担心您需要在web.config中配置设置,并在Azure门户中删除相同的密钥/对。