我正在从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进行了测试,以确认这种情况正在发生。
这是设计使然吗?
答案 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必须是 实施,但我敢肯定仅仅实施一个还不够 在这种情况下是新的消息处理程序。
希望这对您有帮助...