【问题标题】:Azure App Service Application Settings Ignored, Using web.config Instead忽略 Azure App Service 应用程序设置,改用 web.config
【发布时间】:2017-01-17 16:14:33
【问题描述】:

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

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

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

【问题讨论】:

  • 您是第一次将项目部署到部署槽吗?如果是,您还必须将配置添加到部署槽的应用程序设置中。
  • 您能否发布您用于读取配置的 .NET 框架方法的名称?
  • @AbhaySaraf - 它使用ConfigurationManager.ConnectionStrings["..."].ConnectionString 读取设置值。我应该注意到这是 ASP.Net Web API 2
  • 你解决过这个问题吗?我遇到了同样的问题。
  • 这按预期工作,因为如果您在已经运行 ASP.NET 的 AppDomain 之外创建一个新的 AppDomain,则 App-Service 提供的 app-settings 将无法正确注入。当应用程序使用 ASP.NET 请求处理程序模块启动时,我们使用反射注入应用程序设置,因此该技巧仅适用于 ASP.NET 的应用程序域。

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


【解决方案1】:

我最近遇到了同样的问题并修复了它:

  • 在 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 在 GAC 中的镜像,所以我可以从那里复制它。
  • EnvSettings.dll 内部是一个[assembly: PreApplicationStartMethod] 属性,它运行EnvSettings.dll 中的一个方法,该方法将APPSETTING_ 和数据库连接字符串设置从环境变量复制到.NET Framework ConfigurationManager.AppSettingsConfigurationManager.ConnectionStrings 集合中。

    • 请注意,此复制仅发生 一次(在应用程序启动期间),并且仅在第一个 AppDomain - 所以如果您的应用程序中有其他 AppDomain 实例,他们将看不到更新ConfigurationManager
  • 因此,如果您在转储 ConfigurationManager 时发现您的应用服务的 Azure 门户配置设置没有被使用,那么可能会发生以下情况:

    • 您在&lt;compilation&gt;&lt;assemblies&gt; 元素中使用了&lt;clear /&gt;,这完全阻止了EnvSettings.dll 的加载。
      • 在这种情况下,您需要将上面的&lt;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" ) );
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    在此处查看我的示例: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

    正如这里已经提到的,请确保您在正确的插槽中设置了该应用设置。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不想想忽略 Azure 应用程序设置 - 但这就是正在发生的事情。我已仔细检查,可以确认 Azure 应用程序设置键与我们在代码中使用的值匹配。
      • 这与他遇到的问题相反。他遇到的问题是他们没有覆盖 web.config 设置。
      猜你喜欢
      • 1970-01-01
      • 2022-07-31
      • 2023-02-24
      • 2018-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2021-01-12
      相关资源
      最近更新 更多