.NET CORE2.2修改请求和返回body

1.创建中件间

 public class RequestResponseMiddleware
    { 
        private readonly RequestDelegate _next;
        public RequestResponseMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {

            #region 修改请求的body 
            var requestBodyStream = new MemoryStream();//创建一个流 
            //设置当前流的位置未0
            requestBodyStream.Seek(0, SeekOrigin.Begin);//设置从0开始读取
            //这里ReadToEnd执行完毕后requestBodyStream流的位置会从0到最后位置(即request.ContentLength)
            var RequestBody = new StreamReader(context.Request.Body).ReadToEnd();//读取body
            //需要将流位置重置偏移到0,不然后续的action读取不到request.Content的值 
            requestBodyStream.Seek(0, SeekOrigin.Begin);
            byte[] content1 = Encoding.UTF8.GetBytes(RequestBody.Replace("ceo", "CEO"));//替换字符串并且字符串转换成字节
            requestBodyStream.Seek(0, SeekOrigin.Begin);
            requestBodyStream.Write(content1, 0, content1.Length);//把修改写入流中
            context.Request.Body = requestBodyStream;//把修改后的内容赋值给请求body
            context.Request.Body.Seek(0, SeekOrigin.Begin);

            #endregion
            #region 返回数据
            using (var ms = new MemoryStream())//创建一个流
            {    
                var orgBodyStream = context.Response.Body;//获取body内容
                context.Response.Body = ms;//把创建的流赋值给body

                await _next(context);//执行下一个内容
  
                using (var sr = new StreamReader(ms))//
                {

                    ms.Seek(0, SeekOrigin.Begin);
                    if (sr.ReadToEnd().Contains("/uploadfiles/"))
                    {
                        //获取appsettings.json中的
                        var appsettingsjson = JObject.Parse(System.IO.File.ReadAllText("appsettings.json"));
                        var fileUrlConfig = (JObject)appsettingsjson["FileUrlConfig"];
                        var url = fileUrlConfig.Property("Url").Value.ToString();
                        ms.Seek(0, SeekOrigin.Begin);
                        byte[] content = Encoding.UTF8.GetBytes(sr.ReadToEnd().Replace("/uploadfiles", url + "/uploadfiles"));//字符串转换成字节
                        ms.Seek(0, SeekOrigin.Begin);
                        ms.Write(content, 0, content.Length);

                    }
                    ms.Seek(0, SeekOrigin.Begin);
                    await ms.CopyToAsync(orgBodyStream);


                }
               
            }
            #endregion


        }



    }

2.在startup启动项中调用中件间(必须是请求之前调用该中件间)

app.UseMiddleware<RequestResponseMiddleware>();

原文地址:https://www.cnblogs.com/Blog-JJ/p/11639452.html