Кукловод LaunchAsyn c, выбрасывающий исключение - PullRequest
1 голос
/ 04 февраля 2020

У меня есть существующее веб-приложение AS PNET. Внешний интерфейс - HTML / JavaScript, а внутренний - WebAPI 2. Мы использовали NRECO.PDFGenerator для отправки PDF-файлов пользователям, для этого используется браузер QT, и отладка становится рутиной. Я нашел PuppeteerSharp и решил, что попробую.

Я установил библиотеки с помощью nuget, добавил метод Asyn c к одному из моих контроллеров Web Api, но когда я его назвал, метод LaunchAsyn c просто упал.

    [Route("api/pdf/v2/download")]
    public IHttpActionResult V2Download([FromBody]  Models.PDF.List _pdf) {

        Models.Message.Response _return = new Models.Message.Response();
        _return.Message = "Success!";
        _return.Now = DateTime.Now;
        try
        {
            string[] argu = null; 
            Meh(argu);
        }
        catch (Exception ex)
        {
            _return.Message = ex.Message;
            _return.Severity = 3;
        }
        return Ok(_return);
    }


    public static async Task Meh(string[] args)
    {
        var options = new LaunchOptions
        {
            Headless = true,
            Args = new[] {"--no-sandbox" }
        };

        Debug.WriteLine("Downloading chromium");
        await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);

        Debug.WriteLine("Navigating google");
        using (var browser = await Puppeteer.LaunchAsync(options))
        using (var page = await browser.NewPageAsync())
        {

            Debug.WriteLine("Navigating to page");
            await page.GoToAsync("http://www.google.com");

            Debug.WriteLine("Generating PDF");
            await page.PdfAsync(Path.Combine(Directory.GetCurrentDirectory(), "google.pdf"));

            Debug.WriteLine("Export completed");

            if (!args.Any(arg => arg == "auto-exit"))
            {
                Console.ReadLine();
            }
        }
    }

Я не уверен, где go отсюда. Это вывод консоли. Есть еще ...

Навигация в Google Тема 0x3418 вышла с кодом 0 (0x0). Исключение: «System.NullReferenceException» в System.Web.dll. Исключение: «System.NullReferenceException» в mscorlib.dll

В проекте используется фреймворк 4.7.2

Решение

Все, что касается метода Asyn c, также должно быть Asyn c. Кроме того, передача пустых аргументов также вызовет проблемы.

Вот пример кода.

        //[Authorize]
    [Route("api/pdf/v2/download")]
    public async Task<IHttpActionResult> V2Download([FromBody]  Models.PDF.List _pdf) {

        Models.Message.Response _return = new Models.Message.Response();
        _return.Message = "Success!";
        _return.Now = DateTime.Now;
        try
        {
            string[] argu = { }; 
           await Meh(argu);
        }
        catch (Exception ex)
        {
            _return.Message = ex.Message;
            _return.Severity = 3;
        }
        return Ok(_return);
    }


    public static async Task Meh(string[] args)
    {
        var options = new LaunchOptions
        {
            Headless = true
        };

        Debug.WriteLine("Downloading chromium");
        await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);

        Debug.WriteLine("Navigating google");
        using (var browser = await Puppeteer.LaunchAsync(options))
        using (var page = await browser.NewPageAsync())
        {

            Debug.WriteLine("Navigating to page");
            await page.GoToAsync("http://www.google.com");

            Debug.WriteLine("Generating PDF");

            await page.PdfAsync(Path.Combine(Directory.GetCurrentDirectory(), "google.pdf"));

            Debug.WriteLine(Path.Combine(Directory.GetCurrentDirectory(), "google.pdf"));
            Debug.WriteLine("Export completed");

            if (!args.Any(arg => arg == "auto-exit"))
            {
                Console.ReadLine();
            }
        }
    }
...