.net Core自定義中間件中讀取Request.Body和Response.Body的內容


1 .Net Core 2.X版本

public IActionResult Index()
{
    Request.EnableRewind();
    using (var reader = new StreamReader(Request.Body))
    {
        var body = reader.ReadToEnd();
        // Do something
        Request.Body.Seek(0, SeekOrigin.Begin);
        body = reader.ReadToEnd();
    }
    // More code
    return View("Index");
}

2 .NET Core 3.0及以上版本

public class SignatureMiddleware
    {
        private readonly RequestDelegate _next;

        public SignatureMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context) 
        {
            //啟用讀取request
            context.Request.EnableBuffering();

            //變量設置
            var request = context.Request;
            var response = context.Response;

            //請求body
            using var requestReader = new StreamReader(request.Body);
            var requestBody = await requestReader.ReadToEndAsync();
            request.Body.Position = 0;

            //設置stream存放ResponseBody
            var responseOriginalBody = response.Body;
            using var memStream = new MemoryStream();
            response.Body = memStream;
            
            // 執行其他中間件
            await _next(context);

            //處理執行其他中間件后的ResponseBody
            memStream.Position = 0;
            var responseReader = new StreamReader(memStream);
            var responseBody = await responseReader.ReadToEndAsync();
            memStream.Position = 0;
            await memStream.CopyToAsync(responseOriginalBody);
            response.Body = responseOriginalBody;
        }
    }

參照:https://www.cnblogs.com/lwqlun/p/10954936.html


免責聲明!

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



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