c# – ASP NET核心修改/替换请求体
发布时间:2020-12-15 08:34:47 所属栏目:百科 来源:网络整理
导读:我需要替换HttpContext.Request.Body. 我试过在中间件中做这件事 public async Task Invoke(HttpContext context) { if (context.Request.Path.Value.Contains("DataSourceResult")) { var originalBody = new StreamReader(context.Request.Body).ReadToEnd
我需要替换HttpContext.Request.Body.
我试过在中间件中做这件事 public async Task Invoke(HttpContext context) { if (context.Request.Path.Value.Contains("DataSourceResult")) { var originalBody = new StreamReader(context.Request.Body).ReadToEnd(); DataSourceRequest dataSource = null; try { dataSource = JsonConvert.DeserializeObject<DataSourceRequest>(originalBody); } catch { await _next.Invoke(context); } if (dataSource != null && dataSource.Take > 2000) { dataSource.Take = 2000; var bytesToWrite = dataSource.AsByteArray(); await context.Request.Body.WriteAsync(bytesToWrite,bytesToWrite.Length); } else { var bytesToWrite = originalBody.AsByteArray(); await context.Request.Body.WriteAsync(bytesToWrite,bytesToWrite.Length); } } await _next.Invoke(context); } 第一个问题是主体只能读取一次,第二个问题是流是只读的,不能写入. 解决方法
获取请求正文,读取它的内容,根据需要进行必要的更改,然后创建一个新流以传递管道.访问后,必须替换请求流.
public async Task Invoke(HttpContext context) { var request = context.Request; if (request.Path.Value.Contains("DataSourceResult")) { //get the request body and put it back for the downstream items to read var stream = request.Body;// currently holds the original stream var originalContent = new StreamReader(stream).ReadToEnd(); var notModified = true; try { var dataSource = JsonConvert.DeserializeObject<DataSourceRequest>(originalContent); if (dataSource != null && dataSource.Take > 2000) { dataSource.Take = 2000; var json = JsonConvert.SerializeObject(dataSource); //replace request stream to downstream handlers var requestContent = new StringContent(json,Encoding.UTF8,"application/json"); stream = await requestContent.ReadAsStreamAsync();//modified stream notModified = false; } } catch { //No-op or log error } if (notModified) { //put original data back for the downstream to read var requestData = Encoding.UTF8.GetBytes(originalContent); stream = new MemoryStream(requestData); } request.Body = stream; } await _next.Invoke(context); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |