• 如何实现 ASP.NET Core Response Body 的文本替换?
  • 发布于 11小时前
  • 11 热度
    0 评论
前言
我们需要在代理的服务中实现某个 url 地址的替换,需要实现在 ASP.NET Core response body 中文本替换,记录分享一下

例子
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;
        // 堆代码 duidaima.com
        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;
    }
}
使用效果:

其它
需要注意的是这种基于直接读取所有 stream 内容的方式适用于 response 较小的情况,如果只是要记录 response body 的信息,可以使用自带的 HTTP Logging 中间件来实现,或者参考 HTTP Logging 中间件的实现
https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs

参考资料
• https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs
• https://github.com/WeihanLi/SamplesInPractice/blob/main/YarpSamples/YarpDiagnosticSample/ResponseTextReplacementMiddleware.cs
用户评论