通过GitHub Actions部署.NET Web API至Azure时如何包含邮件模板文件
解决.NET Web API部署至Azure App Service后邮件模板文件缺失问题
问题分析
部署后调用/api/users/new/otp接口报错找不到C:\home\site\wwwroot\EmailTemplates\OtpValidation.htm,本质是邮件模板文件未被包含在CI/CD的部署包中——.NET项目默认不会自动将非代码类文件(如.htm)复制到发布输出目录,导致部署到Azure后缺失该文件。
解决方案
1. 配置项目文件,强制模板文件随发布输出
打开项目的.csproj文件,添加以下配置,将EmailTemplates目录下的htm文件设置为发布时自动复制到输出目录:
<ItemGroup> <!-- 单个模板文件配置 --> <Content Include="EmailTemplates\OtpValidation.htm"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> <!-- 若有多个模板文件,用通配符批量配置 --> <!-- <Content Include="EmailTemplates\*.htm"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> --> </ItemGroup>
PreserveNewest表示仅当源文件更新时才复制,避免重复操作;若需每次发布强制复制,可改为Always。
2. 修正代码中的文件路径读取逻辑
避免使用硬编码的绝对路径,改用基于程序运行根目录的相对路径,适配本地和Azure环境:
// 获取程序运行的根目录 var templatePath = Path.Combine(AppContext.BaseDirectory, "EmailTemplates", "OtpValidation.htm"); // 读取模板内容 var templateContent = await File.ReadAllTextAsync(templatePath);
3. 确认GitHub Actions部署步骤的正确性
检查你的GitHub Actions工作流文件(通常位于.github/workflows/目录下),确保部署步骤指向正确的发布输出目录。示例配置:
- name: Deploy to Azure App Service uses: azure/webapps-deploy@v2 with: app-name: 'bookkeeper' publish-profile: ${{ secrets.AZURE_WEBAPP_PUBLISH_PROFILE }} package: ${{ env.DOTNET_ROOT }}/publish
package参数需指向.NET发布命令生成的输出目录,确保该目录包含复制后的模板文件。
验证步骤
- 本地执行
dotnet publish命令,检查输出目录(默认路径为bin/Release/netX.X/publish)下是否存在EmailTemplates文件夹及对应htm文件。 - 提交修改后的代码到GitHub,触发CI/CD流程。
- 部署完成后,通过Azure App Service的SCM站点检查
wwwroot目录下是否存在EmailTemplates文件夹。
内容的提问来源于stack exchange,提问作者Jatin Chhabra
相关产品推荐
相关产品推荐

