ASP.NET Core 中间件或过滤器中读取Request.Body的方法


#事故现场

在asp.net core web api 项目中,框架为.NET5,启动倒带方式,为 request.EnableBuffering()
但是在过滤器中使用此方法时出现异常,request.body的长度总是为0,说明在请求到达过滤器时Steam已经被读取了。

public class TestFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
            var request = context.HttpContext.Request;
            //启动倒带方式
            request.EnableBuffering();
            if (request.Method.ToLower().Equals("post"))
            {
            	    request.Body.Position = 0;
                    using var requestReader = new StreamReader(request.Body);
                    var requestContent = requestReader.ReadToEnd();
                    request.Body.Position = 0;
            }
          
        }
        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }

}

#解决方法

1、在项目的Startup类中的Configure方法中添加如下配置:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
	//其他代码
	
	//启动倒带方式
	app.Use(next => context =>
    {
        context.Request.EnableBuffering();
        return next(context);
    });
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });

}

注意:
EnableBuffering的配置一定要在UseEndpoints的前面;

2、修改过后滤器中的代码:

public override void OnActionExecuting(ActionExecutingContext context)
{
	base.OnActionExecuting(context);
    var request = context.HttpContext.Request;
    
    if (request.Method.ToLower().Equals("post"))
    {
		request.Body.Position = 0;
		using var requestReader = new StreamReader(request.Body);
		var requestContent = requestReader.ReadToEnd();
		request.Body.Position = 0;
  	 } 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值