ASP.NET Core 中是否有相当于“HttpContext.Response.Write”的东西?

问题描述 投票:0回答:4

我正在尝试使用 ASP.NET Core 2 中的 ActionFilter 在页面上附加一些 HTML 和 JavaScript 内容。

在 ASP.NET MVC 中,可以通过以下方式完成:

filterContext.HttpContext.Response.Write(stringBuilder.ToString());

但在 ASP.NET Core 中这不起作用。

我尝试用这个来实现:

filterContext.HttpContext.Response.WriteAsync(stringBuilder.ToString());

但这使我的页面完全空白。

我正在寻找与 nopCommerce 4.0 兼容的解决方案,我将其与 ASP.NET Core 一起使用。

c# asp.net-core nopcommerce httpcontext
4个回答
19
投票

静态异步方法

HttpResponseWritingExtensions.WriteAsync
是目前实现这一目标的首选方式。

您可以在组件中找到它

Microsoft.AspNetCore.Http.Abstractions

using Microsoft.AspNetCore.Http;

[HttpGet("test")]
public async Task GetTest()
    => await HttpResponseWritingExtensions.WriteAsync(this.Response, "Hello World");

使用 ASP.NET Core 6.0,您可以使用 Minimal API 编写一个简单的响应,如下所示:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World");
app.Run();

来源:MSDN


10
投票

Response.Body.Write 采用字节数组作为参数。

public void OnGet() {
    var text = "<h1>Hello, Response!</h1>";
    byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
    Response.Body.Write(data, 0, data.Length);
}

或异步版本:

public async Task OnGetAsync() {
    var text = "<h1>Hello, Async Response!</h1>";
    byte[] data = System.Text.Encoding.UTF8.GetBytes(text);
    await Response.Body.WriteAsync(data, 0, data.Length);
}

4
投票

你可以尝试这样的事情

INopStartup.Configure(IApplicationBuilder application)
的自定义实现中:

application.Use(async (context, next) =>    
{
    using (var customStream = new MemoryStream())
    {
        // Create a backup of the original response stream
        var backup = context.Response.Body;

        // Assign readable/writeable stream
        context.Response.Body = customStream;
        
        await next();

        // Restore the response stream
        context.Response.Body = backup;
        
        // Move to start and read response content
        customStream.Seek(0, SeekOrigin.Begin);
        var content = new StreamReader(customStream).ReadToEnd();
        
        // Write custom content to response
        await context.Response.WriteAsync(content);
    }
});

然后按照您的习惯

ResultFilterAttribute

public class MyAttribute : ResultFilterAttribute
{
    public override void OnResultExecuted(ResultExecutedContext context)
    {
        try
        {
            var bytes = Encoding.UTF8.GetBytes("Foo Bar");
            
            // Seek to end
            context.HttpContext.Response.Body.Seek(context.HttpContext.Response.Body.Length, SeekOrigin.Begin);
            context.HttpContext.Response.Body.Write(bytes, 0, bytes.Length);
        }
        catch
        {
            // ignored
        }

        base.OnResultExecuted(context);
    }
}

结果


1
投票

我的代码没有准备好异步执行,所以我使用了:

Response.WriteAsync("text").Wait();

.Wait() 使执行等待异步方法完成执行才能继续。

我不知道性能是否是最好的,但已经比.Net Framework解决方案更好了

.Wait(): https://learn.microsoft.com/pt-br/dotnet/api/system.io.stream.writeasync?view=net-6.0

.WriteAsync():https://learn.microsoft.com/pt-br/dotnet/api/system.threading.tasks.task.wait?view=net-6.0

© www.soinside.com 2019 - 2024. All rights reserved.