首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web API控制器返回任务并不总是等待任务完成(puppeteer-sharp)

Web API控制器返回任务并不总是等待任务完成(puppeteer-sharp)
EN

Stack Overflow用户
提问于 2019-09-04 20:20:48
回答 1查看 402关注 0票数 1

我有一个Web API控制器,它返回原来在外部库服务中创建的Task。我在从服务到控制器的所有链中返回Task,但问题是,当我对该控制器进行HTTP调用时,当我第一次启动API时(第一次总是花费更长的时间),它会完美地返回预期的结果,但是当我第二次发出请求时,依此类推。它返回一些部分结果。

当我调试它时,它总是返回预期的正确结果。显然,现在有一些东西在等待着..

代码如下:

代码语言:javascript
复制
        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;
        }

和服务:

代码语言:javascript
复制
        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;
            }
        }

正如你所看到的,在扩展库的服务中有很多等待。我试着在所有使用等待的地方使用ConfigureAwait(false),但是这都没有用。

EN

回答 1

Stack Overflow用户

发布于 2019-09-04 20:47:12

我认为您不应该在控制器级别上进行.ConfigureAwait,有关更多信息,请参阅本文:https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html

ASP.NET团队放弃了SynchronizationContext的使用,所以在你的控制器中使用它是毫无意义的。

正如本文所述,您仍然应该在您的服务级别上使用它,因为您不知道UI是否可以将其自身插入服务并使用它,但是在您的WEB API上,您可以放弃它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57788298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档