簡體   English   中英

Web API Controller返回任務並不總是等待任務完成(puppeteer-sharp)

[英]Web API Controller returning Task not always waits for task completion (puppeteer-sharp)

我有Web API控制器,它返回在外部庫服務中創建的Task。 我在從serice到控制器的所有鏈中返回Task,但問題是當我對該控制器進行HTTP調用時,第一次啟動API時(第一次總是需要更長的時間)它會返回預期結果完美,當我第二次提出請求時等等...它返回一些部分結果。

當我調試它時,它總是返回預期的正確結果。 顯然有一些東西現在等待着......

這是代碼:

        public async Task<HttpResponseMessage> DownloadBinary(string content)
        {
            byte[] recordToDown =  await ExternalLibraryConverter.GetAsync(content);

            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ByteArrayContent(recordToDown)
            };
            result.Content.Headers.ContentDisposition =
                new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
                {
                    FileName = "Test file"
                };

            // added so Angular can see the Content-Disposition header
            result.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition");

            result.Content.Headers.ContentType =
                new MediaTypeHeaderValue("application/pdf");

            return result;
        }

和服務:

        public static async Task<byte[]> GetAsync(string content)
        {

            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision)
                .ConfigureAwait(false);
            var browser = await Puppeteer.LaunchAsync(new LaunchOptions
            {
                Headless = true,
            }).ConfigureAwait(false);

            using (var page = await browser.NewPageAsync().ConfigureAwait(false))
            {
                await page.SetCacheEnabledAsync(false).ConfigureAwait(false);

                await page.SetContentAsync(content).ConfigureAwait(false);

                await page.AddStyleTagAsync("https://fonts.googleapis.com/css?family=Open+Sans:300,400,400i,600,700").ConfigureAwait(false);

                // few more styles add

                var result = await page.GetContentAsync().ConfigureAwait(false);

                PdfOptions pdfOptions = new PdfOptions()
                {
                    PrintBackground = true,
                    MarginOptions = new PuppeteerSharp.Media.MarginOptions {
                        Right = "15mm", Left = "15mm", Top = "20mm", Bottom = "20mm" },
                };
                byte[] streamResult = await page.PdfDataAsync(pdfOptions)
                    .ConfigureAwait(false);

                browser.Dispose();

                return streamResult;
            }
        }

你可以看到,在服務中有很多東西可以使用extenral庫。 我嘗試在任何使用await的地方使用ConfigureAwait(false),但這對兩者都沒有幫助。

我認為您不應該在控制器級別上執行.ConfigureAwait,請查看本文以獲取更多信息: https//blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html

ASP.NET團隊放棄了使用SynchronizationContext,因此在控制器中使用它是毫無意義的。

正如文章所述,您仍然應該在服務級別上使用它,因為您不知道UI是否可以將自身插入服務並使用它,但是在您的WEB API上,您可以刪除它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM