【问题标题】:Most efficient way to write to response body in .NET Core 3.1在 .NET Core 3.1 中写入响应正文的最有效方法
【发布时间】:2020-04-27 21:45:13
【问题描述】:

.NET Core 3.1 中是否有更高效的方式写入响应正文?

我知道 Endpoint 的 RequestDelegate 必须是一个 Task,因为它将由 .NET 管道作为线程启动,但使用 await 重复调用 WriteAsync 似乎过于冗长且效率低下。

下面是我想要完成的一些示例代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace Flux
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", DefaultRequest);
            });
        }

        public async Task DefaultRequest(HttpContext context)
        {
            await context.Response.WriteAsync("<html>");
            await context.Response.WriteAsync("<head>");
            await context.Response.WriteAsync("<title>Hello World!</title>");
            await context.Response.WriteAsync("</head>");
            await context.Response.WriteAsync("<body>");
            await context.Response.WriteAsync("Hello World!");
            await context.Response.WriteAsync("</body>");
            await context.Response.WriteAsync("</html>");
        }
    }
}

【问题讨论】:

  • 你能用StringBuilder之类的东西建立字符串,然后打电话给WriteAsync吗?
  • 我可以,但更多的是了解是否有更好的方式与响应主体交互。例如,我知道有BodyWriter 属性,但我不确定这是否比WriteAsync 更有效。
  • 这里有一些测量:stackoverflow.com/q/33940903/5045688
  • Alexander,这正是我要寻找的信息。谢谢!

标签: c# asp.net-core asp.net-core-3.1 c#-8.0


【解决方案1】:

看起来你正在寻找的是注入一个静态 html 文件。这里有一个教程你可以使用:Click Me

这样你可以简单地编写你的 html 文件,然后注入它,所以你不必逐行进行。 :

【讨论】:

  • 没有,我只是添加了一些静态HTML作为示例。
【解决方案2】:

根据answer given by Rick LoveStringBuilder 方法比同步Response.Write 慢,但它比Response.WriteAsync 方法快得多。

【讨论】:

  • "StringBuilder 方法比同步 Response.Write" 慢。真的吗??
  • @HadiSamadzad 真的,不难看出为什么 - Write 直接向调用者发送数据,甚至是部分数据,而不使用任何额外的内存,而 StringBuilder 必须构造整个响应,本质上是缓存它,在它可以被发送之前...... Write。对于大型响应,这会严重降低可伸缩性导致 GC 开销。当然,对于较大的响应,避免使用 WriteAsync 进行阻塞操作比异步开销重要得多
  • @HadiSamadzad 如果您想向客户端发送大型 CSV,您可以使用 Write 逐行发送。使用 StringBuilder,您必须先在内存中构建整个文件(在 LOH 中分配),然后再将其发送到客户端
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2021-05-18
  • 2018-12-24
  • 1970-01-01
  • 2021-03-13
  • 2020-10-10
相关资源
最近更新 更多