我正在尝试使用真正基本的 ASP.NET Core 6 应用程序实现简单的流(非缓冲输出)。
下面的简单代码应该将 hello world 文本输出到客户端,然后关闭连接(甚至通过添加文档IHttpResponseBodyFeature
选项) :
app.MapGet("/a", async (ctx) =>
{
var gg = ctx.Features.Get<Microsoft.AspNetCore.Http.Features.IHttpResponseBodyFeature>()!;
gg.DisableBuffering();
await ctx.Response.Body.WriteAsync(Encoding.UTF8.GetBytes("Hello, World!"));
await ctx.Response.Body.FlushAsync();
await Task.Delay(2000);
});
这当然是我试图实现的行为的一个简单示例。
对应用程序的简单curl 请求可以显示hello world 文本仅在等待2 秒后才到达客户端。
在 .NET Framework 上,以下代码按预期工作:
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.Output.WriteLine("Hello World!");
Response.Output.Flush();
System.Threading.Tasks.Task.Delay(2000).Wait();
Response.End();
简单的curl请求会立即显示“hello world”文本,2秒后连接关闭。
提前致谢。
经过几次尝试和搜索后,我在 github 上发现了以下问题:
https://github.com/dotnet/aspnetcore/issues/26565 https://github.com/dotnet/aspnetcore/issues/26565
使用那里的代码,我设法想出了一种处理非缓冲输出的简单方法(也适用于 app.MapGet,如问题所示):
HttpContext.Response.StatusCode = 200;
await using var bodyStream = HttpContext.Response.BodyWriter.AsStream();
await HttpContext.Response.StartAsync();
for (var i = 0; i < 3; i++)
{
await bodyStream.WriteAsync(Encoding.UTF8.GetBytes(Convert.ToBase64String(new byte[128 * 1])));
await bodyStream.FlushAsync();
await Task.Delay(2000);
}
await HttpContext.Response.CompleteAsync();
return Ok();
我的应用程序有一些中间件,这使得调试变得更糟,禁用它会使我的应用程序/场景上的一切变得更加简单。
感谢您的评论,我希望这有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)