Blazor 获取HTTP流会阻止渲染

Blazor 获取HTTP流会阻止渲染,blazor,blazor-client-side,Blazor,Blazor Client Side,我正在从WebAPI下载一个流,并试图在读取流时运行代码 下面的代码在Blazor服务器端或控制台应用程序上运行良好。但是在blazor客户端,流将在执行任何代码之前首先完全下载。。。。即使只是一个控制台。WriteLine()也会在流完成后开始写入控制台。 我正在使用最新的.NETCore3.0预览版8 public async IAsyncEnumerable<SomeClass> GetDataAsync() { var serializer = new JsonSer

我正在从WebAPI下载一个流,并试图在读取流时运行代码

下面的代码在Blazor服务器端或控制台应用程序上运行良好。但是在blazor客户端,流将在执行任何代码之前首先完全下载。。。。即使只是一个控制台。WriteLine()也会在流完成后开始写入控制台。 我正在使用最新的.NETCore3.0预览版8

public async IAsyncEnumerable<SomeClass> GetDataAsync()
{
    var serializer = new JsonSerializer();
    using (var stream = await Http.GetStreamAsync("https://localhost:44334/api/values/i"))
    {
        using (var sr = new StreamReader(stream))
        using (var jr = new JsonTextReader(sr))
        {
            while (await jr.ReadAsync()) //<-- Stream is fully download to browser before taking any actions.
            {
                if (jr.TokenType != JsonToken.StartArray && jr.TokenType != JsonToken.EndArray)
                {
                    Console.WriteLine(jsonReader.LinePosition);
                    yield return serializer.Deserialize<SomeClass>(jr);
                }
            };
        }
    }
}
公共异步IAsyncEnumerable GetDataAsync() { var serializer=new JsonSerializer(); 使用(var stream=await Http.GetStreamAsync(“https://localhost:44334/api/values/i")) { 使用(var sr=新的StreamReader(stream)) 使用(var jr=新的JsonTextReader(sr)) { while(等待jr.ReadAsync())// 这是故意的吗

我想这是目前的设计

这不会阻塞,因为客户端Blazor支持异步/等待模式。在我看来,真正的问题在于HttpClient.GetStreamAsync,因为HttpClient服务(客户端Blazor)不是实际的或真正的HttpClient。它基于JavaScript获取Api():

但是如果他们切换到mono实现 (),流媒体将是 如果浏览器支持,则支持:

对arrayBuffer()的调用永远不会从纯流返回。A 必须使用基于的不同MessageHandler 实现了,但我很确定仅仅实现一个 本例中的新消息处理程序

希望这有助于

这是故意的吗

我想这是目前的设计

这不会阻塞,因为客户端Blazor支持异步/等待模式。在我看来,真正的问题在于HttpClient.GetStreamAsync,因为HttpClient服务(客户端Blazor)不是实际的或真正的HttpClient。它基于JavaScript获取Api():

但是如果他们切换到mono实现 (),流媒体将是 如果浏览器支持,则支持:

对arrayBuffer()的调用永远不会从纯流返回。A 必须使用基于的不同MessageHandler 实现了,但我很确定仅仅实现一个 本例中的新消息处理程序


希望这有帮助…

谢谢你的回答,它肯定证实了我的猜测。对于网络工作者来说,Blazor客户端将如何实现这一点?任何简单的指针都将不胜感激。以前从未这样做过……但是,你可以在谷歌上搜索这一点。这里有两个关于这个主题的链接:ReadAsync应该是可能的。在e代码试图创建一个线程。我认为可以/应该在这里应用。显然它不是(现在)以这种方式实现。@Henkholtman这是我不理解的。在
await Http.GetStreamAsync
中使用await/async有什么意义,如果它阻止了浏览器。@Charlie,这不会阻止,因为客户端Blazor支持异步/await模式。在我看来,真正的问题在于HttpClient.GetStreamsync,因为HttpClient服务(客户端Blazor)不是实际的或真实的HttpClient。它基于JavaScript获取Api().当我键入此评论时,我开始相信这是罪魁祸首。我将在github上发布此问题;也许他们对正在发生的事情有更好的了解。感谢您的回答,它肯定证实了我的怀疑。对于Web工作者来说,Blazor客户端如何实现这一点?请提供任何简单的指针。永远不要这样做所以…不过,你可以在谷歌上搜索这个。这里有两个关于这个主题的链接:ReadAsync应该是可能的。代码中没有任何东西试图创建线程。我认为可以/应该在这里应用。显然它不是(现在)以这种方式实现。@Henkholtman这是我不理解的。在
await Http.GetStreamAsync
中使用await/async有什么意义,如果它阻止了浏览器。@Charlie,这不会阻止,因为客户端Blazor支持异步/await模式。在我看来,真正的问题在于HttpClient.GetStreamAsync,因为HttpClient服务(客户端Blazor)不是真实的HttpClient。它基于JavaScript Fetch Api()。当我键入此注释时,我开始相信它是罪魁祸首。我将在github中发布此问题;也许他们对正在发生的事情有更好的了解。
responseData = await response.arrayBuffer();