Невозможно выполнить Puppeteer в IISC#

Место общения программистов C#
Ответить
Anonymous
 Невозможно выполнить Puppeteer в IIS

Сообщение Anonymous »

У меня есть веб-API ASP.NET Core 8.0, созданный с помощью C#, который предоставляет конечную точку для создания PDF-файлов из разметки HTML. Я использую PuppeteerSharp для создания PDF-файла, и он отлично работает локально, но не работает при развертывании в IIS на компьютере с Windows Server.
Чтобы глубже изучить эту проблему, я извлек код создания PDF-файла в отдельное приложение:

Код: Выделить всё

using PuppeteerSharp;
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace MSS.PdfExport
{
public class Parameters
{
public string Html { get; set; }

public string Base64 { get; set; }

public Parameters()
{
Html = string.Empty;
Base64 = string.Empty;
}
}

internal class Program
{
static void Main(string[] args)
{
var streamWriter = new StreamWriter(@"C:\Temp\Test\Log.txt", false, Encoding.UTF8)
{
AutoFlush = true
};

// Read parsed HTML code.
var stringBuilder = new StringBuilder();

while (true)
{
var ch = Convert.ToChar(Console.Read());
stringBuilder.Append(ch);

if (ch == '\n')
{
break;
}
}

var sbText = stringBuilder.ToString();

streamWriter.WriteLine($"{nameof(stringBuilder)} = {stringBuilder}");
streamWriter.WriteLine();
streamWriter.WriteLine();
streamWriter.WriteLine();

// Get HTML code.
var html = WebUtility.UrlDecode(sbText);

streamWriter.WriteLine($"{nameof(html)} = {html}");
streamWriter.WriteLine();
streamWriter.WriteLine();
streamWriter.WriteLine();

// Execute generator.
try
{
var test = new Parameters()
{
Html = html
};

ExportPdf(test).Wait();

Console.WriteLine(test.Base64);

File.WriteAllText(@"C:\Temp\Test\output.txt", test.Base64);
}
catch (Exception ex)
{
streamWriter.WriteLine();
streamWriter.WriteLine();
streamWriter.WriteLine();

streamWriter.WriteLine($"{nameof(ex)} = {ex}");
}
finally
{
streamWriter.Close();
}
}

private static async Task ExportPdf(Parameters parameters)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();

var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
Args = ["--no-sandbox", "--disable-setuid-sandbox"]
});

using (var page = await browser.NewPageAsync())
{
await page.SetContentAsync(parameters.Html);

var data = await page.PdfDataAsync(new PdfOptions
{
PrintBackground = true
});

parameters.Base64 = Convert.ToBase64String(data);
}

await browser.CloseAsync();
}
}
}
Приложение считывает входной поток HTML в кодировке URL, преобразует его в HTML и, наконец, использует Puppeteer, чтобы открыть Chromium без заголовка, преобразовать HTML в PDF, записать результаты в консоль и записать в файл.
Если я сохраню текст HTML в кодировке URL в текстовый файл и выполню свое приложение через командную строку Windows, все работает отлично!

Код: Выделить всё

MSS.PdfExport.exe < "C:\Temp\Test\New Text Document.txt"
Однако, когда я вызываю приложение из своего API с помощью этого кода:

Код: Выделить всё

// Decode the HTML code.
var html = WebUtility.UrlDecode(model.Html);

_logger.LogInformation($"{this}.Index > Execute generation.");

var htmlBytes = Encoding.UTF8.GetBytes(model.Html);
var utf8Html = Encoding.UTF8.GetString(htmlBytes);

_logger.LogInformation($"{this}.Index > {nameof(utf8Html)} = {utf8Html}");
_logger.LogInformation($"{this}.Index >  {nameof(utf8Html.Length)} = {utf8Html.Length}");

var startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = false;
startInfo.UseShellExecute = false;
startInfo.FileName = @"C:\Temp\PdfExport\MSS.PdfExport.exe";
startInfo.WorkingDirectory = @"C:\Temp\PdfExport\";
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;

var output = string.Empty;

try
{
using (var process = Process.Start(startInfo))
{
_logger.LogInformation($"{this}.Index > Process started. {nameof(startInfo)} = [{startInfo}]");

if (process is not null)
{
using (var writer = process.StandardInput)
{
if (writer.BaseStream.CanWrite)
{
writer.WriteLine(utf8Html);
}
}

var reader = process.StandardOutput;
output = reader.ReadToEnd();

_logger.LogInformation($"{this}.Index > {nameof(output)} = \"{output}\"");

process.WaitForExit();
}
}
}
catch (Exception exception)
{
_logger.LogInformation($"{this}.Index > {nameof(exception)} = {exception}");
}
Puppeteer не работает, и я получаю следующее исключение:

System.AggregateException: произошла одна или несколько ошибок. (Не удалось запустить браузер!
[112204:131028:1023/144647.887:ERROR:base\win\message_window.cc:124] Не удалось зарегистрировать класс окна для окна только для сообщений: запрошенный ключ поиска не найден ни в одном активном контексте активации. (0x36B7))
PuppeteerSharp.ProcessException: не удалось запустить браузер! [112204:131028:1023/144647.887:ОШИБКА:base\win\message_window.cc:124] Не удалось зарегистрировать класс окна для окна только для сообщений: запрошенный ключ поиска не найден ни в одном активном контексте активации. (0x36B7)
в PuppeteerSharp.States.ProcessStartingState.StartCoreAsync(LauncherBase p) в /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/States/ProcessStartingState.cs:line 83

в PuppeteerSharp.States.ProcessStartingState.StartCoreAsync(LauncherBase p) в /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/States/ProcessStartingState.cs:line 89

at PuppeteerSharp.Launcher.LaunchAsync (параметры LaunchOptions) в /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Launcher.cs:line 77

в PuppeteerSharp.Launcher.LaunchAsync (параметры LaunchOptions) в /home/runner/work/puppeteer-sharp/puppeteer-sharp/lib/PuppeteerSharp/Launcher.cs:line 110

в MSS.PdfExport.Program.ExportPdf (параметры параметров) в [отредактировано]\MSS.PdfExport\Program.cs:line 94

--- Конец трассировки внутреннего стека исключений ---

at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)

at System.Threading.Tasks.Task.Wait(Int32 миллисекундыTimeout, CancellationToken cancelToken)

at System.Threading.Tasks.Task.Wait()

в MSS.PdfExport.Program.Main(String[] args) в [отредактировано]\MSS.PdfExport\Program.cs:строка 69


Подробнее здесь: https://stackoverflow.com/questions/797 ... eer-in-iis
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»