实现 ASP.NET Core Response Body 的文本替换
Intro
我们需要在代理的服务中实现某个 url 地址的替换,需要实现在 ASP.NET Core response body 中文本替换,记录分享一下
Sample
public class ResponseTextReplacementMiddleware(RequestDelegate next)
{
public async Task InvokeAsync(HttpContext context)
{
var whetherToReplace = WhetherToRelace(context);
if (!whetherToReplace)
{
await next(context);
return;
}
var originalResponseStream = context.Response.Body;
usingvar memoryStream = new MemoryStream();
context.Response.Body = memoryStream;
await next(context);
context.Response.Body = originalResponseStream;
memoryStream.Seek(0, SeekOrigin.Begin);
usingvar reader = new StreamReader(memoryStream);
var responseText = await reader.ReadToEndAsync(context.RequestAborted);
var replacedText = responseText.Replace("World", ".NET");
if (replacedText == responseText)
{
memoryStream.Seek(0, SeekOrigin.Begin);
await memoryStream.CopyToAsync(context.Response.Body, context.RequestAborted);
}
else
{
await context.Response.WriteAsync(replacedText, context.RequestAborted);
}
}
private static bool WhetherToRelace(HttpContext context)
{
// feature flag integration
returntrue;
}
}
使用效果:
More
需要注意的是这种基于直接读取所有 stream 内容的方式适用于 response 较小的情况,如果只是要记录 response body 的信息,可以使用自带的 HTTP Logging 中间件来实现,或者参考 HTTP Logging 中间件的实现
https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs
References
-
• https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs -
• https://github.com/WeihanLi/SamplesInPractice/blob/main/YarpSamples/YarpDiagnosticSample/ResponseTextReplacementMiddleware.cs

