c# - 重写响应体 asp.net 核心客户中间件
问题描述
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
namespace DemoReact
{
public class Middlewarecustom
{
private readonly RequestDelegate _next;
public Middlewarecustom(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context) {
using (var buffer = new MemoryStream()) {
var stream = context.Response.Body;
context.Response.Body = buffer;
await _next.Invoke(context);
buffer.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(buffer);
using (var bufferReader = new StreamReader(buffer)) {
string body = await bufferReader.ReadToEndAsync();
WeatherForecast wf = new WeatherForecast();
wf.Date = DateTime.Now;
wf.Summary = "demo";
wf.TemperatureC = 31;
var jsonString = JsonConvert.SerializeObject(wf);
byte[] bytess = Encoding.ASCII.GetBytes(jsonString);
var data = new MemoryStream(bytess);
context.Response.Body = data;
}
}
}
}
}
我创建了自定义中间件 asp.net 核心来修改响应正文,但在
context.Response.Body = data 之后,客户端的响应为空白;似乎对此不起作用任何帮助表示赞赏
解决方案
试试下面的代码,它可能会起作用。我已经评论了 3 行,并在下面添加了一些。我被困在类似的情况下,我已经通过来自不同参考的多个答案解决了这个问题。就像下面的链接。
public async Task Invoke(HttpContext context) {
using (var buffer = new MemoryStream()) {
var stream = context.Response.Body;
context.Response.Body = buffer;
await _next.Invoke(context);
buffer.Seek(0, SeekOrigin.Begin);
var reader = new StreamReader(buffer);
using (var bufferReader = new StreamReader(buffer)) {
string body = await bufferReader.ReadToEndAsync();
WeatherForecast wf = new WeatherForecast();
wf.Date = DateTime.Now;
wf.Summary = "demo";
wf.TemperatureC = 31;
var jsonString = JsonConvert.SerializeObject(wf);
// Commented below lines.
// byte[] bytess = Encoding.ASCII.GetBytes(jsonString);
// var data = new MemoryStream(bytess);
// context.Response.Body = data;
// Added new code
await context.Response.WriteAsync(jsonString);
context.Response.Body.Seek(0, SeekOrigin.Begin);
// below code is not working with .Net 6 and it requires CopyToAsync.
//context.Response.Body.CopyTo(stream);
await context.Response.Body.CopyToAsync(stream); //it prevents it must be async, if it isn't there is an exception in .Net 6.
context.Response.Body = stream;
}
}
}
推荐阅读
- javascript - 有没有办法通过指定您不想发送任何浏览器数据来发送跨域请求?
- apache-spark - 如何使用 Dataset 在 Java Spark 中表示平面图
- django - Django 和 celery DatabaseError: DatabaseWrapper
- c# - 如何通过 ATATA 登录
- azure - Azure 函数应用程序 - 数据自动转义引号并引发错误
- anaconda - 与 Anaconda 相关的问题。它发生在我运行“conda update --all”之后。我不知道如何解决它。有人可以帮助解决这个问题吗?
- docker - JNDI 没有绑定名称
- php - 循环问题 - AJAX/jQuery
- angular - 有没有办法在不使用 MatTableDataSource 的情况下对材料表进行材料分页?角 10
- sql - 合并时间戳中按毫秒分组的多行