3

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

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

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

4

3 回答 3

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(不幸的是,该目录是受访问控制的,我无法进入它)。

    • 但是在 GAC 中EnvSettings.dll 镜像,所以我可以从那里复制它。
  • 内部EnvSettings.dll是一个[assembly: PreApplicationStartMethod]属性,它运行一种方法,在EnvSettings.dll该方法中,APPSETTING_将环境变量中的数据库连接字符串设置复制到 .NET FrameworkConfigurationManager.AppSettingsConfigurationManager.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" ) );
            }
        }
    }
}
于 2020-06-27T20:56:07.323 回答
-1

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

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

于 2016-09-10T09:03:30.990 回答
-4

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

于 2016-09-10T06:32:19.483 回答