我的Azure App Service从何处读取.NET 6 Web API的应用配置?
问题场景
我用GitHub Actions将.NET 6 Web API部署到Azure App Service,项目包含三个配置文件:
- appsettings.json
- appsettings.development.json
- appsettings.production.json
部署后应用能正常读取所有配置值,但Azure门户的「应用设置」面板是空的。修改appsettings.production.json中的值重新部署后,配置变更生效,但门户里依然看不到这些配置项,我想知道这是怎么回事。
我的GitHub Action配置
name: API CI/CD env: AZURE_WEBAPP_NAME: test # set this to the name of your Azure Web App AZURE_WEBAPP_PACKAGE_PATH: '.' # set this to the path to your web app project, defaults to the repository root DOTNET_VERSION: '6.0' # set this to the .NET Core version to use on: push: branches: [ "main" ] workflow_dispatch: permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up .NET Core uses: actions/setup-dotnet@v2 with: dotnet-version: ${{ env.DOTNET_VERSION }} - name: Set up dependency caching for faster builds uses: actions/cache@v3 with: path: ~/.nuget/packages key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }} restore-keys: | ${{ runner.os }}-nuget- - name: Build with dotnet run: dotnet build --configuration Release - name: dotnet publish run: dotnet publish Test.Api -c Release -o ${{env.DOTNET_ROOT}}/myapp - name: Upload artifact for deployment job uses: actions/upload-artifact@v3 with: name: .net-app path: ${{env.DOTNET_ROOT}}/myapp deploy: permissions: contents: none runs-on: ubuntu-latest needs: build environment: name: 'production' url: ${{ steps.deploy-to-webapp.outputs.webapp-url }} steps: - name: Download artifact from build job uses: actions/download-artifact@v3 with: name: .net-app - name: Deploy to Azure Web App id: deploy-to-webapp uses: azure/webapps-deploy@v2 with: app-name: ${{ env.AZURE_WEBAPP_NAME }} publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} package: ${{ env.AZURE_WEBAPP_PACKAGE_PATH }}
我的Program.cs代码
var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.RegisterApiVersioning(); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.RegisterOptions(builder.Configuration); builder.Services.RegisterServices(builder.Configuration); builder.Services.RegisterSwagger(); var app = builder.Build(); app.UseCors(maksCorsPolicy); app.ConfigureSwagger(); app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.UseMiddleware<ExceptionMiddleware>(); app.Run();
原因解释
1. .NET默认配置加载逻辑
WebApplication.CreateBuilder(args)会自动按优先级加载多个配置来源,其中就包括:
- 基础的appsettings.json
- 对应环境的appsettings.{Environment}.json(生产环境下就是appsettings.production.json)
- Azure App Service的应用设置(以环境变量形式注入)
- 命令行参数
生产环境下,Azure App Service的默认环境名称是Production,所以应用启动时会自动读取部署包中的appsettings.production.json文件。
2. 配置文件被包含在发布包中
你的GitHub Action执行dotnet publish -c Release时,默认会把appsettings.production.json打包到发布目录里——因为.NET项目中这类配置文件的「复制到输出目录」属性默认是「如果较新则复制」,发布过程中会将其包含在部署包内,最终上传到Azure App Service的site/wwwroot目录下。应用运行时直接读取这个本地文件里的配置。
3. Azure门户「应用设置」和本地配置文件是两个独立来源
Azure门户里的「应用设置」是作为环境变量注入到应用进程的配置来源,和本地的appsettings文件完全独立。只有当你在门户中手动添加/修改配置项时,才会在这里显示;本地配置文件里的内容不会自动同步到门户面板中,所以你看不到这些配置,但应用依然能读取到。
验证方式
你可以登录Azure App Service的Kudu控制台(访问https://<你的应用名>.scm.azurewebsites.net/),进入site/wwwroot目录,就能看到appsettings.production.json文件,打开后就能确认里面的配置内容,这就是应用读取的来源。
建议做法
- 敏感配置放门户应用设置:生产环境的敏感信息(比如数据库连接字符串、API密钥)建议放到Azure门户的「应用设置」中,因为环境变量的优先级高于本地配置文件,既能避免敏感信息提交到代码仓库,又能在不重新部署的情况下修改配置。
- 配置优先级覆盖:如果要保留本地配置作为基础,同时用门户设置覆盖同名项,.NET的配置系统会自动处理——环境变量会覆盖本地配置文件中的对应值。
- 集中配置管理:如果配置项较多,可使用Azure App Configuration服务来统一管理所有环境的配置,进一步提升安全性和可维护性。
内容的提问来源于stack exchange,提问作者uodami

