.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