502 Error: Bad Gateway on Azure App Service with IronPDF
502 Error: Bad Gateway on Azure App Service with IronPDF
我正在尝试让 IronPDF 在我的 ASP.NET Core 3.1 应用服务部署中工作。
我没有为此使用 Azure Functions,只是 Azure 应用服务上的常规端点 - 当用户调用它时,该服务会生成并 returns 一个生成的 PDF 文档。
当 运行 本地主机上的端点时,它完美地工作 - 从传递给方法的 HTML 生成报告。但是,一旦我将它部署到我的 Azure Web 应用服务,我就会收到 502 - Bad Gateway 错误,如附件所示(为整洁起见,在 Swagger 中显示)。
控制器:
[HttpPost]
[Route("[action]")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<IActionResult> AgencyDownload([FromBody] AgencyReportSubmissionDto filters)
{
var user = await _userService.GetUserByIdAsync(HttpContext.User.GetUserId());
// Generate the PDF
var content = await _agencyReport.Generate(user, null, filters.FilterDate, filters.Content, filters.Type);
// Return the PDF to the browser
return new FileContentResult(content.BinaryData, "application/pdf") { FileDownloadName = "report.pdf" };
}
服务:
public async Task<PdfDocument> Generate(User user, byte[] letterhead, DateTimeOffset filterDate, string html, AgencyReportTypes reportType)
{
var corporateIdentity = new CorporateIdentity()
{
PrimaryColor = "#000000",
PrimaryTextColor = "#ffffff",
SecondaryColor = "#ffffff"
};
// Inserts the HTML content (from form) into the HTML template
var htmlContent = Template(corporateIdentity.PrimaryColor, corporateIdentity.PrimaryTextColor).Replace("{{HtmlContent}}", html);
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("South Africa Standard Time");
var convertedDate = TimeZoneInfo.ConvertTimeFromUtc(filterDate.UtcDateTime, tz);
var Renderer = new ChromePdfRenderer();
Renderer.RenderingOptions.Title = "Agency Report - for " + convertedDate.ToString("d MMMM yyyy");
Renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
var doc = await Renderer.RenderHtmlAsPdfAsync(htmlContent);
return doc;
}
解法:
我注意到如果我对该应用程序服务执行手动部署,它可以正常工作,但是当我从我的管道部署时 - 我遇到了上述错误。
所以我四处窥探我的管道,并将其更改为这个,它起作用了。
- task: AzureRmWebAppDeployment@4
displayName: Deploy API Artifact
inputs:
ConnectionType: 'AzureRM'
AzureSubscription: 'My-Azure-Subscription'
enableCustomDeployment: true
DeploymentType: 'zipDeploy'
deployToSlotOrASE: true
SlotName: 'development'
AppType: 'webApp'
WebAppName: 'my-api'
Package: '$(Pipeline.Workspace)/**/API.zip'
ResourceGroupName: 'MyResource'
'部署类型:'zipDeploy'" 是关键。
感谢 Alex Hanneman 为我指明了正确的方向。
应用程序服务 运行将您的应用程序放在沙盒中,大多数 PDF 库都会失败。查看 IronPDF documentation,他们说您可以 运行 在 VM 或容器中使用它。由于您已经在使用 App Service,只需将您的应用程序打包到容器中,将其发布到容器注册表并将 App Service 配置为 运行 它。
我还在使用 Azure App Service 作为 API,包装 IronPDF。升级到最新的 Iron PDF 包也破坏了我的应用程序,返回 502。
我修复它的方法是使用 ZipDeploy 部署代码,然后将 WEBSITE_RUN_FROM_PACKAGE 设置为 0。这也是让 Iron PDF 日志文件显示在 Azure 中所必需的,正如他们在此处推荐的那样: https://iron.helpscoutdocs.com/article/122-azure-log-files.
我正在尝试让 IronPDF 在我的 ASP.NET Core 3.1 应用服务部署中工作。 我没有为此使用 Azure Functions,只是 Azure 应用服务上的常规端点 - 当用户调用它时,该服务会生成并 returns 一个生成的 PDF 文档。
当 运行 本地主机上的端点时,它完美地工作 - 从传递给方法的 HTML 生成报告。但是,一旦我将它部署到我的 Azure Web 应用服务,我就会收到 502 - Bad Gateway 错误,如附件所示(为整洁起见,在 Swagger 中显示)。
控制器:
[HttpPost]
[Route("[action]")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<IActionResult> AgencyDownload([FromBody] AgencyReportSubmissionDto filters)
{
var user = await _userService.GetUserByIdAsync(HttpContext.User.GetUserId());
// Generate the PDF
var content = await _agencyReport.Generate(user, null, filters.FilterDate, filters.Content, filters.Type);
// Return the PDF to the browser
return new FileContentResult(content.BinaryData, "application/pdf") { FileDownloadName = "report.pdf" };
}
服务:
public async Task<PdfDocument> Generate(User user, byte[] letterhead, DateTimeOffset filterDate, string html, AgencyReportTypes reportType)
{
var corporateIdentity = new CorporateIdentity()
{
PrimaryColor = "#000000",
PrimaryTextColor = "#ffffff",
SecondaryColor = "#ffffff"
};
// Inserts the HTML content (from form) into the HTML template
var htmlContent = Template(corporateIdentity.PrimaryColor, corporateIdentity.PrimaryTextColor).Replace("{{HtmlContent}}", html);
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("South Africa Standard Time");
var convertedDate = TimeZoneInfo.ConvertTimeFromUtc(filterDate.UtcDateTime, tz);
var Renderer = new ChromePdfRenderer();
Renderer.RenderingOptions.Title = "Agency Report - for " + convertedDate.ToString("d MMMM yyyy");
Renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;
var doc = await Renderer.RenderHtmlAsPdfAsync(htmlContent);
return doc;
}
解法:
我注意到如果我对该应用程序服务执行手动部署,它可以正常工作,但是当我从我的管道部署时 - 我遇到了上述错误。
所以我四处窥探我的管道,并将其更改为这个,它起作用了。
- task: AzureRmWebAppDeployment@4
displayName: Deploy API Artifact
inputs:
ConnectionType: 'AzureRM'
AzureSubscription: 'My-Azure-Subscription'
enableCustomDeployment: true
DeploymentType: 'zipDeploy'
deployToSlotOrASE: true
SlotName: 'development'
AppType: 'webApp'
WebAppName: 'my-api'
Package: '$(Pipeline.Workspace)/**/API.zip'
ResourceGroupName: 'MyResource'
'部署类型:'zipDeploy'" 是关键。
感谢 Alex Hanneman 为我指明了正确的方向。
应用程序服务 运行将您的应用程序放在沙盒中,大多数 PDF 库都会失败。查看 IronPDF documentation,他们说您可以 运行 在 VM 或容器中使用它。由于您已经在使用 App Service,只需将您的应用程序打包到容器中,将其发布到容器注册表并将 App Service 配置为 运行 它。
我还在使用 Azure App Service 作为 API,包装 IronPDF。升级到最新的 Iron PDF 包也破坏了我的应用程序,返回 502。
我修复它的方法是使用 ZipDeploy 部署代码,然后将 WEBSITE_RUN_FROM_PACKAGE 设置为 0。这也是让 Iron PDF 日志文件显示在 Azure 中所必需的,正如他们在此处推荐的那样: https://iron.helpscoutdocs.com/article/122-azure-log-files.