You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:19:50