【问题标题】:PuppeteerSharp in IISIIS 中的 PuppeteerSharp
【发布时间】:2020-06-17 09:54:27
【问题描述】:

我面临着一个令人讨厌的情况。我们尝试在我们的应用程序中使用 PuppeteerSharp 来生成背景 PDF,虽然它在开发模式下运行良好,但在生产环境中却无法运行。

该应用是 WebAPI 2.0 站点、.NET4.7.1、Windows 10 机器。我认为这两种环境之间的主要区别是:

  • 在 Release 中构建而不是 Debug:在 Debug 或 Release 模式下从控制台应用程序调用我的代码似乎以相同的方式工作
  • 在开发中托管在 IIS Express 中,在生产中托管完整的 IIS

我们使用以下代码:

var launchOptions = new LaunchOptions
{
    DefaultViewport = new ViewPortOptions
    {
        Width = 1920,
        Height = 1080,
        IsLandscape = printOptions.Orientation == PrintOrientation.Landscape
    },
    ExecutablePath = this._chromiumPath,
    Timeout = Timeout,
    TransportFactory = AspNetWebSocketTransport.AspNetTransportFactory
};

var browser = await Puppeteer.LaunchAsync(launchOptions)
    .ConfigureAwait(false);

var page = await browser.NewPageAsync()
    .ConfigureAwait(false);
await page.EmulateMediaTypeAsync(PuppeteerSharp.Media.MediaType.Print)
    .ConfigureAwait(false);

await page.GoToAsync(url, Timeout, new[] { WaitUntilNavigation.Networkidle0 })
    .ConfigureAwait(false);
await page.WaitForTimeoutAsync(2000)
    .ConfigureAwait(false);
var options = new PdfOptions
{
    Width = printOptions.Format == PrintFormat.A4 ? "210mm" : "297mm",
    Height = printOptions.Format == PrintFormat.A4 ? "297mm" : "420mm",
    PrintBackground = true,
    Landscape = printOptions.Orientation == PrintOrientation.Landscape,
    MarginOptions = new PuppeteerSharp.Media.MarginOptions
    {
        Top = ".4in",
        Bottom = ".4in",
        Left = ".4in",
        Right = ".4in"
    }
};
await page.PdfAsync(outputFile, options)
    .ConfigureAwait(false);
return result;

page.GoToAsync 永不返回,并最终超时。

编辑:

  • 我在所有异步调用中将 ConfigureAwait 设置为 false
  • 我尝试使用 AspNetWebSocketTransport.AspNetTransportFactory 传输工厂,但似乎也不起作用

【问题讨论】:

  • 您可以尝试在每个异步调用中添加 ConfigureAwait 吗?
  • 感谢您的及时回复。我会尝试使用truefalse 看看,然后我会回复你
  • 一定是假的:)
  • 我以为我在 GitHub 上的某个问题上读过; truefalse 似乎都没有产生影响……托管环境(IIS Express 与 IIS)是否会受到影响? (我不明白怎么做)

标签: puppeteer-sharp


【解决方案1】:
using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions()
{
    Headless = true,
    ExecutablePath = browserFetcher.GetExecutablePath(BrowserFetcher.DefaultRevision)
})

帮我解决了这个问题,AspNetWebSocketTransport 出现了引用问题,似乎不再有用了

【讨论】:

    【解决方案2】:

    如果您在 IIS 上部署 .NET Framework 应用程序。您还需要使用PuppeteerSharp.AspNetFramwork 并将TransportFactory 设置为浏览器:

    using (var browser = await Puppeteer.LaunchAsync(new LaunchOptions()
    {
        Headless = true,
        TransportFactory = AspNetWebSocketTransport.AspNetTransportFactory,
        ExecutablePath = browserFetcher.GetExecutablePath(BrowserFetcher.DefaultRevision)
    }).ConfigureAwait(false))
    

    更新:Nuget 包已过时(硬引用 PuppeteerSharp 1.0.0.0),但可以在此处找到源:https://github.com/hardkoded/puppeteer-sharp/blob/076897d0cf627c947c61a1192fcb20d968d05cbc/lib/PuppeteerSharp.AspNetFramework/AspNetWebSocketTransport.cs

    【讨论】:

    • 啊,我明白了。但是,从 nuget 安装软件包后,我在 AspNetWebSocketTransport 类上没有可用的静态成员 AspNetTransportFactory...
    • 给我到明天,我会给你一些东西。
    • @HuguesStefanski 很奇怪,道具在那里github.com/hardkoded/puppeteer-sharp/blob/…
    • 刚刚尝试了更新的AspNetFramework 版本,仍然无法在IIS 中运行。我将尝试继续解决问题或设法在隔离的 WebApi 中重现。我会及时通知您。
    • 好吧,我可能找到了罪魁祸首:服务器和客户端之间有一个开放的 SignalR 连接。我关闭了所说的连接(因为在 PDF 渲染中没有用),看起来 GoToAsync 方法现在可以正确返回 NetworkIdle0。我的猜测是浏览器认为该请求仍然处于活动状态,并且从未返回。为什么它在调试模式下或从另一个 WebAPI 工作仍然是一个谜,但我可能已经摆脱了困境(尽管仍有待在实际服务器上进行检查......)。感谢您的支持!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2021-03-29
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多