在請求到達過濾器時Steam已經被讀取了,此時我們在過濾器中使用EnableBuffering並沒有起作用, 還需要在中間件裏使用EnableBuffering
在.net 6有一些稍微的不同
1. 在program.cs裏通過中間件啓用倒帶
//啓用倒帶, 在發生異常時, 可以通過過濾器獲取post參數 app.Use((context, next) => { context.Request.EnableBuffering(); return next(context); });
2. 在異常過濾器裏使用
/// <summary> /// OnException /// </summary> /// <param name="context"></param> public void OnException(ExceptionContext context) { //請求參數 var param = ""; if (context.HttpContext.Request.Method == "GET") { param = context.HttpContext.Request.QueryString.Value; } else if (context.HttpContext.Request.Method == "POST") { context.HttpContext.Request.EnableBuffering();//啓用倒帶, 讀取request.body裏的的參數, 還必須在在Program.cs裏也啓用倒帶功能 context.HttpContext.Request.Body.Position = 0; using var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8); param = reader.ReadToEndAsync().Result; } }