PuppeteerSharp в IIS - PullRequest
       23

PuppeteerSharp в IIS

1 голос
/ 17 июня 2020

Я столкнулся с неприятной ситуацией. Мы пытаемся использовать PuppeteerSharp в нашем приложении для создания фонового PDF-файла, и, хотя он хорошо работает в режиме разработки, он не работает в производственной среде.

Приложение представляет собой сайт WebAPI 2.0, .NET4.7.1, Windows 10 автомат. Основные различия, которые я мог бы видеть между двумя средами:

  • сборка в Release вместо Debug: вызов моего кода из консольного приложения в режиме отладки или выпуска, похоже, работает одинаково
  • Хостинг в 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 никогда не возвращается, и в конечном итоге out.

Изменить:

  • Я установил ConfigureAwait на false во всех асинхронных c вызовах
  • Я пробовал использовать AspNetWebSocketTransport.AspNetTransportFactory транспортная фабрика, которая вроде тоже не работает

1 Ответ

0 голосов
/ 17 июня 2020

Если вы развертываете приложение. NET Framework на IIS. Вам также необходимо использовать PuppeteerSharp.AspNetFramwork и установить TransportFactory в браузере:

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