获取HTTP流正在阻止呈现

时间:2019-08-21 16:14:56

标签: blazor blazor-client-side

我正在从WebAPI下载流,并且正在尝试在读取流时运行代码。

下面的代码在Blazor服务器端或控制台应用程序上可以正常工作。但是在blazor-client端,流将首先完全下载,然后再执行任何代码....即使是Console.WriteLine()也将在流完成后才开始写入Console。 我正在使用最新的.Net Core 3.0 Preview 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);
                }
            };
        }
    }
}

我用WireShark进行了测试,以确认这种情况正在发生。

这是设计使然吗?

1 个答案:

答案 0 :(得分:0)

  

这是设计使然吗?

我猜这是目前设计的

这不会仅仅因为客户端Blazor支持async / await模式而阻止。在我看来,真正的问题在于HttpClient.GetStreamAsync,因为HttpClient服务(客户端Blazor)不是真正的HttpClient还是真正的HttpClient。它基于JavaScript Fetch Api(https://github.com/aspnet/AspNetCore/blob/master/src/Components/Web.JS/src/Services/Http.ts):

responseData = await response.arrayBuffer(); 
  

但是如果他们切换到单声道实现   (https://github.com/aspnet/AspNetCore/issues/10489),流式传输将是   如果浏览器支持,则支持:   https://github.com/mono/mono/blob/254d6d37580a70fbb4fa072b0b2b16d2984b3bb5/sdks/wasm/framework/src/WebAssembly.Net.Http/WasmHttpMessageHandler.cs#L171-L173

     

对arrayBuffer()的调用将永远不会从纯流中返回。一种   基于this example 的不同MessageHandler必须是   实施,但我敢肯定仅仅实施一个还不够   在这种情况下是新的消息处理程序。

希望这对您有帮助...