作者:麦豪小仙 | 来源:互联网 | 2023-02-01 14:09
我的要求:编写一个中间件,用于过滤来自另一个后续中间件(例如Mvc)的响应中的所有"坏词".
问题:响应的流式传输.因此,当我们FilterBadWordsMiddleware
从已经写入响应的后续中间件回到我们的时候,我们对派对来说太迟了......因为响应已经开始发送,这导致了众所周知的错误response has already started
......
因此,这是许多不同情况下的要求 - 如何处理它?
1> Ilya Chumako..:
替换响应流MemoryStream
以防止其发送.修改响应后返回原始流:
public class EditResponseMiddleware
{
private readonly RequestDelegate _next;
public EditResponseMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
var originBody = context.Response.Body;
var newBody = new MemoryStream();
context.Response.Body = newBody;
await _next(context);
newBody.Seek(0, SeekOrigin.Begin);
string json = new StreamReader(newBody).ReadToEnd();
context.Response.Body = originBody;
await context.Response.WriteAsync(modifiedJson);
}
}
这是一种解决方法,它可能会导致性能问题.我希望在这里看到更好的解决方案.