• .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>();

  • 相关阅读:
    Laravel中如何将单个routes.php分割成多个子文件
    PHP中“==”运算符的安全问题
    一些需要禁用的PHP危险函数
    使用PHP QR Code生成二维码
    gulp详细入门教程
    h5+分享到微信、朋友圈代码示例
    学习地址
    关于this 方法中套方法中找 立即执行的问题 等问题
    判断条件问题是否存在
    jsp 基础语法
  • 原文地址:https://www.cnblogs.com/Blog-JJ/p/11639452.html
Copyright © 2020-2023  润新知