.NET 6 WebApi部署IIS时PuppeteerSharp调用PdfStreamAsync超时
.NET 6 WebApi部署IIS后PuppeteerSharp的PdfStreamAsync超时问题
在.NET 6 WebApi项目中使用PuppeteerSharp 20.0.2,开发模式下运行完全正常,但部署到IIS后,调用PdfStreamAsync()会触发三分钟超时错误。
最初怀疑是沙箱权限问题,但查看日志发现仅提示"Timeout of 180000 ms exceeded",没有明确的权限错误提示。将InstalledBrowser.PermissionsFixed写入日志,结果为True。
初始代码
[HttpGet()] public async Task<ActionResult> Get() { var installedBrowser = await new BrowserFetcher().DownloadAsync(); _logger.LogInformation($"PermissionsFixed is {installedBrowser.PermissionsFixed}"); using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true })) { using (var page = await browser.NewPageAsync()) { await page.GoToAsync("https://www.google.co.uk"); var stream = await page.PdfStreamAsync(); return File(stream, "application/pdf"); } } }
应用目录下已生成“Chrome”和“ChromeHeadlessShell”文件夹,版本均为Win64-128.0.6613.119。
错误日志
System.TimeoutException: Timeout of 180000 ms exceeded at PuppeteerSharp.Helpers.TaskHelper.WithTimeout[T](Task`1 task, TimeSpan timeout, Func`2 exceptionFactory) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Helpers/TaskHelper.cs:line 185 at PuppeteerSharp.Cdp.CdpCDPSession.SendAsync(String method, Object args, Boolean waitForCallback, CommandOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Cdp/CdpCDPSession.cs:line 113 at PuppeteerSharp.CDPSession.SendAsync[T](String method, Object args, CommandOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/CDPSession.cs:line 48 at PuppeteerSharp.Cdp.CdpPage.PdfInternalAsync(String file, PdfOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Cdp/CdpPage.cs:line 822 at PuppeteerSharp.Page.PdfStreamAsync(PdfOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Page.cs:line 389 at WebApplication6.Controllers.PdfController.Get() in C:\Users\paulh\source\repos\WebApplication6\WebApplication6\Controllers\PdfController.cs:line 23
补充调试信息
为排查问题,添加了更多日志输出:
[HttpGet()] public async Task<ActionResult> Get() { var installedBrowser = await new BrowserFetcher().DownloadAsync(); _logger.LogInformation($"PermissionsFixed is {installedBrowser.PermissionsFixed}"); using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true, DumpIO = true, Args = new[] { "--enable-logging", "--v=1" } })) { using (var page = await browser.NewPageAsync()) { page.Request += (sender, e) => { _logger.LogInformation($"CHROMERequest: {e.Request.Url}"); }; page.Response += (sender, e) => { _logger.LogInformation($"CHROMEResponse: {e.Response.Url} - {e.Response.Status}"); }; page.RequestFailed += (sender, e) => { _logger.LogInformation($"CHROMERequest failed: {e.Request.Url} - {e.Request.FailureText}"); }; page.DOMContentLoaded += (sender, e) => { _logger.LogInformation($"CHROMEDOM Content Loaded {e.ToString}"); }; page.Console += (sender, e) => { _logger.LogInformation($"CHROMEConsole {e.Message}"); }; page.Error += (sender, e) => { _logger.LogInformation($"CHROMEError {e.Error}"); }; page.PageError += (sender, e) => { _logger.LogInformation($"CHROMEPageError {e.Message}"); }; _logger.LogInformation("LOG 1"); await page.GoToAsync("https://www.e-idvglobal.com/cookie.php"); _logger.LogInformation("LOG 2"); var stream = await page.PdfStreamAsync(); _logger.LogInformation("LOG 3"); return File(stream, "application/pdf"); } } }
日志显示页面加载的所有Request、Response事件均无异常,且总能收到LOG 2消息。
开发环境日志
2024-09-26 16:44:47.025 +01:00 [INF] LOG 2 2024-09-26 16:44:47.212 +01:00 [INF] LOG 3 2024-09-26 16:44:47.240 +01:00 [INF] Executing FileStreamResult, sending file with download name '' ... 2024-09-26 16:44:47.242 +01:00 [DBG] The file result has not been enabled for processing range requests. To enable it, set the EnableRangeProcessing property on the result to 'true'. 2024-09-26 16:44:47.345 +01:00 [INF] Executed action WebApplication6.Controllers.PdfController.Get (WebApplication6) in 1984.0378ms 2024-09-26 16:44:47.391 +01:00 [INF] Executed endpoint 'WebApplication6.Controllers.PdfController.Get (WebApplication6)' 2024-09-26 16:44:47.394 +01:00 [INF] HTTP GET /pdf responded 200 in 2125.9885 ms 2024-09-26 16:44:47.397 +01:00 [INF] Request finished HTTP/2 GET https://localhost:7262/pdf - - - 200 36438 application/pdf 2140.8124ms
IIS环境日志
2024-09-26 16:30:33.363 +01:00 [INF] LOG 2 2024-09-26 16:33:33.456 +01:00 [INF] Executed action WebApplication6.Controllers.PdfController.Get (WebApplication6) in 183781.045ms 2024-09-26 16:33:33.457 +01:00 [INF] Executed endpoint 'WebApplication6.Controllers.PdfController.Get (WebApplication6)' 2024-09-26 16:33:33.460 +01:00 [ERR] HTTP GET /pdf responded 500 in 183823.8211 ms System.TimeoutException: Timeout of 180000 ms exceeded at PuppeteerSharp.Helpers.TaskHelper.WithTimeout[T](Task`1 task, TimeSpan timeout, Func`2 exceptionFactory) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Helpers/TaskHelper.cs:line 185 at PuppeteerSharp.Cdp.CdpCDPSession.SendAsync(String method, Object args, Boolean waitForCallback, CommandOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Cdp/CdpCDPSession.cs:line 113 at PuppeteerSharp.CDPSession.SendAsync[T](String method, Object args, CommandOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/CDPSession.cs:line 48 at PuppeteerSharp.Cdp.CdpPage.PdfInternalAsync(String file, PdfOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Cdp/CdpPage.cs:line 822 at PuppeteerSharp.Page.PdfStreamAsync(PdfOptions options) in /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Page.cs:line 389 at WebApplication6.Controllers.PdfController.Get() in C:\Users\paulh\source\repos\WebApplication6\WebApplication6\Controllers\PdfController.cs:line 63 at lambda_method4(Closure , Object )
内容的提问来源于stack exchange,提问作者PaulH567
相关产品推荐
相关产品推荐

