gpt4 book ai didi

忽略 Azure 应用服务应用程序设置,改用 web.config

转载 作者:行者123 更新时间:2023-12-05 08:12:58 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

  • 在 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 反射(reflect)在 GAC 中,因此我可以从那里复制它。
  • 里面EnvSettings.dll[assembly: PreApplicationStartMethod]运行 EnvSettings.dll 中的方法的属性它复制 APPSETTING_和数据库连接字符串设置从环境变量到 .NET Framework ConfigurationManager.AppSettingsConfigurationManager.ConnectionStrings收藏。

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

    • 您使用了<clear />在你的<compilation><assemblies>元素,停止 EnvSettings.dll完全不被加载。
      • 在这种情况下,您需要添加回 <add assembly="EnvSettings...从上面的元素到您自己的 web.config ,或者找到其他方式来加载它。
        • 我不建议保存 EnvSettings.dll本地并向您的项目添加程序集引用,如 EnvSettings.dll是 Microsoft Web 托管框架的一部分。
    • 或者您有正在清除或重置的代码 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" ) );
}
}
}
}

关于忽略 Azure 应用服务应用程序设置,改用 web.config,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com