Azure App Service应用程序设置被忽略,请使用web.config

时间:2016-09-09 13:33:24

标签: azure asp.net-web-api azure-web-sites azure-app-api

我最近将ASP.Net Web API项目部署到我们的Azure App Service测试槽,但在向API端点发出请求时开始收到错误。通过远程调试,很明显该应用程序正在从部署的web.config文件中提取我的开发连接字符串。

连接字符串假设来自我们通过Azure门户设置的应用程序设置 - 而且,在以前的部署中,它们是 - 但事实并非如此。

为什么会发生这种情况以及可以采取哪些措施来确保发生正确的行为?我们绝对希望我们的生产数据库机密通过web.config ...

放入GIT

3 个答案:

答案 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.AppSettingsConfigurationManager.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"];

Pulling App Settings

.NET应用程序设置的Wiki页面:
https://github.com/projectkudu/kudu/wiki/Managing-settings-and-secrets

如前所述,请确保您在正确的插槽中安装了该应用设置。

答案 2 :(得分:-1)

据我所知,Azure门户中的设置将覆盖Web.config中的现有设置。因此,如果要忽略门户中的Azure应用程序设置并使用Web.config。我担心您需要在web.config中配置设置,并在Azure门户中删除相同的密钥/对。