Blazor中组件的异步Http请求

问题描述 投票:0回答:1

在Blazor中创建组件列表时,这些组件中的每个组件都需要从网页请求一些数据。该列表在.razor页面上创建如下:

@foreach(stringcomp in Complist){
   <myComponent />
}

大约创建了100个组件。在所有这些组件上,都会执行以下URL请求(使用此代码):

        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            if (firstRender)
            {
                await GetUrl("some url here");
            }
        }


        public async Task<string> GetUrl(string url)
        {
            HttpClient client = new HttpClient();
            var request = new HttpRequestMessage(HttpMethod.Get, url);
            request.Headers.Add("User-Agent", "get data service");
            var response = await client.SendAsync(request).ConfigureAwait(false);
            string res = null;
            if (response.IsSuccessStatusCode)
            {
                using var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
                var streamReader = new StreamReader(responseStream);
                res = await streamReader.ReadToEndAsync().ConfigureAwait(false);
            }
            return res;
        }

这样做,我遇到了一些问题,其中大多数对[[SendAsync的调用都从不返回值。我已经了解到这是由于处于锁定状态,但是对于我自己的一生,无法弄清楚如何解决它。最相似的答案建议设置。ConfigureAwait(false),但这在我的情况下并不会带来不同的结果。

所以我的问题是:我可以同时在不同的组件中请求网页,并确保它们不会挂起/查找。由于有很多请求有时需要很长时间(5-10秒)才能完成,因此同步处理不是替代选择。

提到我的代码和页面是分开的,每个.razor页面都使用@inherits来获取其功能/逻辑,这也许也很重要

async-await blazor dotnet-httpclient blazor-server-side
1个回答
0
投票
尝试如下使用IHttpClientFactory:

[Inject] public IHttpClientFactory clientFactory { get; set;} using System.IO;

您的GetUrl方法:

public async Task<string> GetUrl(string url) { var request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("Accept", "application/json"); request.Headers.Add("User-Agent", "get data service"); var client = clientFactory.CreateClient(); var response = await client.SendAsync(request); string res = null; if (response.IsSuccessStatusCode) { using var responseStream = await response.Content.ReadAsStreamAsync(); var streamReader = new StreamReader(responseStream); res = await streamReader.ReadToEndAsync().ConfigureAwait(false); } return res; }

Startup.cs

public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(); // More code here... }

希望此方法有效...    
© www.soinside.com 2019 - 2024. All rights reserved.