.netcore3.1 多次获取请求body报 System.ObjectDisposedException: Cannot access a disposed object. Object name: 'FileBufferingReadStream'.


  开发中遇到 Cannot access a disposed object错误,大多数是多次读取请求Body流造成的,需要换一种获取请求Body流方法,不能使用StreamRreader方式,使用Body.CopyTo(ms)方法

    •  配置可以同步请求读取流数据
 public void ConfigureServices(IServiceCollection services)
        {
  //配置可以同步请求读取流数据
            services.Configure<KestrelServerOptions>(x => x.AllowSynchronousIO = true)
                .Configure<IISServerOptions>(x => x.AllowSynchronousIO = true);

 

    • 在Startup配置中添加EnableBuffering

  

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {

          app.Use(next => context =>
            {
                context.Request.EnableBuffering();
                return next(context);
            });    

 

    • 在过滤器中,获取Post请求Body的Context使用下面方式获取     
   public override async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
             context.HttpContext.Request.EnableBuffering();
                    context.HttpContext.Request.Body.Position = 0;
                    string bodyStr = string.Empty;
                    //using (var reader = new StreamReader(context.HttpContext.Request.Body, Encoding.UTF8))
                    //{
                    // var bodyRead = reader.ReadToEndAsync();
                    // bodyStr = bodyRead.Result;  //把body赋值给bodyStr
                    // needKey = JsonConvert.DeserializeAnonymousType
            //(bodyRead.Result, new Dictionary<string, object>())[dependencySource].ToString();
//} using (var ms = new MemoryStream()) { context.HttpContext.Request.Body.CopyTo(ms); var b = ms.ToArray(); bodyStr = Encoding.UTF8.GetString(b); //把body赋值给bodyStr var dicObj= JsonConvert.DeserializeAnonymousType(bodyStr, new Dictionary<string, object>()); }



 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM