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