参考文章:
深入探究ASP.NET Core读取Request.Body的正确方式 https://www.cnblogs.com/wucy/archive/2021/05/06/14699717.html
当然我们也可以自己实现一套逻辑来替换Body,只要我们重写的时候让这个Stream支持重置读取位置即可。
直接上代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
//允许body重用
app.Use(next => context =>
{
context.Request.EnableBuffering();
return next(context);
})
}
//过滤器或者中间件中调用
string body = await request.Body.ReadToStringAsync();
public static partial class Extention
{
/// <summary>
/// 将流Stream转为byte数组
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public static byte[] ReadToBytes(this Stream stream)
{
stream.Seek(0, SeekOrigin.Begin);
byte[] bytes = new byte[stream.Length];
stream.Read(bytes, 0, bytes.Length);
stream.Seek(0, SeekOrigin.Begin);
return bytes;
}
/// <summary>
/// 将流读为字符串
/// 注:默认使用UTF-8编码
/// </summary>
/// <param name="stream">流</param>
/// <returns></returns>
public static async Task<string> ReadToStringAsync(this Stream stream)
{
return await stream.ReadToStringAsync(Encoding.UTF8);
}
/// <summary>
/// 将流读为字符串
/// 注:使用指定编码
/// </summary>
/// <param name="stream">流</param>
/// <param name="encoding">指定编码</param>
/// <returns></returns>
public static async Task<string> ReadToStringAsync(this Stream stream, Encoding encoding)
{
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
string resStr = string.Empty;
resStr =await new StreamReader(stream, encoding).ReadToEndAsync();
if (stream.CanSeek)
{
stream.Seek(0, SeekOrigin.Begin);
}
return resStr;
}
}