.netcore使用中间件替换请求body中的字符串

中间件修改请求body

1、允许请求body被多次读取,需要在startup添加

            app.Use(next => context =>
            {
                context.Request.EnableBuffering();
                return next(context);
            });

2、添加中间件类


public class RequestImageReplaceMiddleware
{
    private readonly RequestDelegate _next;
    private readonly FileUploadSetting _fileUploadSetting;

    public RequestImageReplaceMiddleware(RequestDelegate next, FileUploadSetting fileUploadSetting)
    {
        _next = next;
        _fileUploadSetting = fileUploadSetting;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        if (context.Request.Body != null)
        {
            var syncIOFeature = context.Features.Get<IHttpBodyControlFeature>();
            if (syncIOFeature != null)
            {
                syncIOFeature.AllowSynchronousIO = true;
            }
            StreamReader stream = new StreamReader(context.Request.Body);
            context.Request.Body.Seek(0, SeekOrigin.Begin);
            string requestBody = stream.ReadToEnd();//同步读取
            if (!string.IsNullOrEmpty(requestBody))
            {
                bool isJson = true;
                try
                {
                    JToken.Parse(requestBody);
                    isJson = true;
                }
                catch
                {
                    isJson = false;
                }
                if (isJson)
                {
                    //保存信息时将所有的url域名替换成指定字符串,在返回时候再将指定字符串替换成域名。
                    byte[] content1 = Encoding.UTF8.GetBytes(requestBody.Replace(_fileUploadSetting.ImageDomain, CommonConst.ImageDomainReplace));
                    var requestBodyStream = new MemoryStream();//创建一个流 
                    requestBodyStream.Seek(0, SeekOrigin.Begin);//设置从0开始读取
                    requestBodyStream.Write(content1, 0, content1.Length);//把修改写入流中
                    context.Request.Body = requestBodyStream;//把修改后的内容赋值给请求body
                    context.Request.ContentLength = requestBodyStream.Length;
                }
            }

            context.Request.Body.Seek(0, SeekOrigin.Begin);
        }

        await _next(context);
    }
}

3、添加use方法的类


 public static class RequestImageReplaceMiddlewareExtensions
 {
     public static IApplicationBuilder UseRequestImageReplace(this IApplicationBuilder builder)
     {
         return builder.UseMiddleware<RequestImageReplaceMiddleware>(Array.Empty<object>());
     }
 }

4、在startup的Configure添加

 app.UseRequestImageReplace();

过滤器修改响应的body

1、添加过滤器类

    /// <summary>
    /// 图片域名替换过滤器
    /// </summary>
    public class ResponseImageReplaceFilter : ActionFilterAttribute
    {
        private readonly FileUploadSetting _fileUploadSetting;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileUploadSetting"></param>
        public ResponseImageReplaceFilter(FileUploadSetting fileUploadSetting)
        {
            _fileUploadSetting = fileUploadSetting;
        }

        public override void OnResultExecuting(ResultExecutingContext context)
        {
            if (context.Result is ObjectResult objRst)
            {
                if (objRst.Value == null)
                {
                    return;
                }
                try
                {
                    context.Result = new ObjectResult(JToken.Parse(JsonConvert.SerializeObject(objRst.Value).Replace(CommonConst.ImageDomainReplace, _fileUploadSetting.ImageDomain)));
                }
                catch
                {

                }
            }
        }
    }

2、startup修改

       services.AddMvc(a =>
       {
           a.Filters.Add<ResponseImageReplaceFilter>();
       })
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值