ASP.NET Core-中間件中讀取、修改Request.Body、Response.Body


參考:
https://www.cnblogs.com/lwqlun/p/10954936.html
https://zablo.net/blog/post/asp-net-core-redis-html-cache/ (緩存)

修改Request.Body

//這里ReadToEnd執行完畢后requestBodyStream流的位置會從0到最后位置(即request.ContentLength)            
            var RequestBody = new StreamReader(HttpContext.Request.BodyReader.AsStream()).ReadToEnd();//讀取body
            byte[] content1 = Encoding.UTF8.GetBytes(RequestBody.Replace("ceo", "CEO"));//替換字符串並且字符串轉換成字節

            var requestBodyStream = new MemoryStream();//創建一個流 
            requestBodyStream.Seek(0, SeekOrigin.Begin);//設置從0開始讀取
            requestBodyStream.Write(content1, 0, content1.Length);//把修改寫入流中
            HttpContext.Request.Body = requestBodyStream;//把修改后的內容賦值給請求body
            HttpContext.Request.Body.Seek(0, SeekOrigin.Begin);

修改Response.Body

默認的ResponseStream不能讀和寫操作,更換默認的ResponseStream為MemoryStream,這樣就可以對Response輸出的內容進行讀寫操作了

public class ResponseDistributedCacheMiddleware
    {
        protected RequestDelegate _next;

        private ILogger<ResponseDistributedCacheMiddleware> _logger;

        public ResponseDistributedCacheMiddleware(RequestDelegate next, ILogger<ResponseDistributedCacheMiddleware> logger)
        {
            this._next = next;
            this._logger = logger;
        }

        public async Task Invoke(HttpContext httpContext)
        {
#if DEBUG
            #region request
            string bodyAsText = null;
            HttpRequest request = httpContext.Request;
            string method = request.Method;

            if (HttpMethods.IsPost(method)  //新增
             || HttpMethods.IsPut(method)   //修改全部
             || HttpMethods.IsPatch(method) //修改部分
            )
            {
                //https://devblogs.microsoft.com/aspnet/re-reading-asp-net-core-request-bodies-with-enablebuffering/
                request.EnableBuffering();//允許多次讀取HTTP請求的正文
                using (var reader = new StreamReader(request.Body,
                                                     encoding: Encoding.UTF8,
                                                     detectEncodingFromByteOrderMarks: false,
                                                     leaveOpen: true)
                      )
                {
                    bodyAsText = await reader.ReadToEndAsync();
                    request.Body.Position = 0;
                }
                if (!string.IsNullOrWhiteSpace(bodyAsText))
                {
                    bodyAsText = System.Web.HttpUtility.UrlDecode(bodyAsText);
                }
            }
            #endregion
#endif
            #region response
            HttpResponse response = httpContext.Response;
            var responseOriginalStream = response.Body;
            try
            {
                using (var memoryResponseStream = new MemoryStream())
                {
                    //更換默認的Response流對象
                    response.Body = memoryResponseStream;
                    await _next.Invoke(httpContext);
                    memoryResponseStream.Seek(0, SeekOrigin.Begin);
                    await memoryResponseStream.CopyToAsync(responseOriginalStream);
                }
            }
            catch (Exception e)
            {
                this._logger.LogError(e, "出錯啦(┬_┬)");
            }
            finally
            {
                response.Body = responseOriginalStream;
            }
            #endregion

        }

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM