重新编写响应体 asp.net core 客户中间件

Kho*_*hon 5 c# asp.net-core asp.net-core-webapi

using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace DemoReact
{
    public class Middlewarecustom
    {

        private readonly RequestDelegate _next;

        public Middlewarecustom(RequestDelegate next)
        {
            _next = next;
        }
        public async Task Invoke(HttpContext context) {
            using (var buffer = new MemoryStream()) {
                var stream = context.Response.Body;
                context.Response.Body = buffer;
                await _next.Invoke(context);
                buffer.Seek(0, SeekOrigin.Begin);
                var reader = new StreamReader(buffer);
                using (var bufferReader = new StreamReader(buffer)) { 
                string body = await bufferReader.ReadToEndAsync();
                    WeatherForecast wf = new WeatherForecast();
                    wf.Date = DateTime.Now;
                    wf.Summary = "demo";
                    wf.TemperatureC = 31;
                    var jsonString = JsonConvert.SerializeObject(wf);
                    byte[] bytess = Encoding.ASCII.GetBytes(jsonString);
                    var data = new MemoryStream(bytess);
                    context.Response.Body = data;
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了自定义中间件 asp.net core 来修改响应正文,但在
context.Response.Body = data;之后客户端的响应为空白;似乎对此没有任何帮助表示赞赏

Kar*_*ran 14

尝试像下面的代码它可能会工作。我评论了 3 行,并在下面添加了几行。我陷入了类似的境地,我已经通过不同参考文献的多个答案解决了这个问题。就像下面的链接一样。

  1. 修改中间件响应
  2. 异常时在 ASP.NET Core 中间件上获取空响应

public async Task Invoke(HttpContext context) {
    using (var buffer = new MemoryStream()) {
        var stream = context.Response.Body;
        context.Response.Body = buffer;
        await _next.Invoke(context);
        buffer.Seek(0, SeekOrigin.Begin);
        var reader = new StreamReader(buffer);
        using (var bufferReader = new StreamReader(buffer)) { 
        string body = await bufferReader.ReadToEndAsync();
            WeatherForecast wf = new WeatherForecast();
            wf.Date = DateTime.Now;
            wf.Summary = "demo";
            wf.TemperatureC = 31;
            var jsonString = JsonConvert.SerializeObject(wf);
            
            // Commented below lines.
            // byte[] bytess = Encoding.ASCII.GetBytes(jsonString);
            // var data = new MemoryStream(bytess);
            // context.Response.Body = data;
            
            // Added new code
            await context.Response.WriteAsync(jsonString);
            context.Response.Body.Seek(0, SeekOrigin.Begin);
            
            // below code is not working with .Net 6 and it requires CopyToAsync.
            //context.Response.Body.CopyTo(stream);
            await context.Response.Body.CopyToAsync(stream); //it prevents it must be async, if it isn't there is an exception in .Net 6.
            context.Response.Body = stream;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我对这一点赞不绝口,你救了我的培根,谢谢!(从 .NET 5 开始工作) (3认同)