我试过在中间件中做这件事
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); }
第一个问题是主体只能读取一次,第二个问题是流是只读的,不能写入.
如何修改/替换request.body(我需要更改请求体的属性值)?
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);}总结
以上是内存溢出为你收集整理的c# – ASP NET核心修改/替换请求体全部内容,希望文章能够帮你解决c# – ASP NET核心修改/替换请求体所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)