代码之家  ›  专栏  ›  技术社区  ›  Raju Paladiya

Asp中是否有与“HttpContext.Response.Write”等效的。Net Core 2?

  •  11
  • Raju Paladiya  · 技术社区  · 8 年前

    我试图使用Asp中的ActionFilter在页面上附加一些HTML和Javascript内容。Net Core 2。

    在MVC中,它与

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

    但在核心部分,它不起作用。

    我试着实现这一点:

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

    但它使整个页面变为空白。

    我正在寻找在Asp中构建的nopCommerce 4.0的解决方案。核心2.0

    4 回复  |  直到 5 年前
        1
  •  19
  •   ˈvɔlə    4 年前

    静态和异步方法 HttpResponseWritingExtensions.WriteAsync 是目前实现这一目标的首选方式。

    目前,您可以在部件中找到它 Microsoft.AspNetCore.Http.Abstractions

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

    更新2022-02-23

    跟这个话题有点关系。使用ASP。NET Core 6.0您可以使用以下最低API编写简单的响应:

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

    Source: MSDN

        2
  •  9
  •   dragansr    8 年前

    回答身体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);
    }
    
        3
  •  4
  •   Raphael    8 年前

    你可以试试这样的

    在的自定义实现中 无法启动。配置(IApplicationBuilder应用程序)

    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);
        }
    });
    

    而不是你的习惯 结果过滤属性

    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);
        }
    }
    

    结果呢

    Result HTML

    希望这有助于走上正确的道路。

        4
  •  0
  •   Comth    4 年前

    我的代码没有为异步执行做好准备,因此我使用了:

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

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

    我不知道表演是否是最好的,但已经比。Net Framework解决方案

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

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

    推荐文章