ASP.NET Core 6 MVC:如何在中间件中读取控制器返回的JSON数据
实现中间件读取控制器返回的JSON结果并判断
问题说明
已实现QuartzStopStartMiddleware中间件,要求当请求路径为/Home/JobPage且请求方法为POST时,额外判断控制器返回的JSON中result字段是否为true,以此作为if判断的第三个条件。
解决方案
默认情况下HttpContext.Response.Body是只读流,无法直接读取返回内容,需要通过替换流的方式实现读取,具体步骤如下:
- 在调用后续中间件前,将
Response.Body替换为可读写的MemoryStream,同时保存原始流 - 执行后续中间件/控制器逻辑
- 重置
MemoryStream位置,读取返回的JSON内容 - 反序列化JSON并判断
result字段值 - 将读取的内容写回原始流,保证响应能正常返回给客户端
修改后的中间件代码
using System.Text.Json; public class QuartzStopStartMiddleware { private readonly RequestDelegate _next; public QuartzStopStartMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { // 保存原始响应流 var originalResponseBody = context.Response.Body; // 创建可读写的内存流 using var responseBodyStream = new MemoryStream(); context.Response.Body = responseBodyStream; try { // 执行后续中间件及控制器逻辑 await _next(context); // 仅处理指定路径的POST请求 if (context.Request.Path == "/Home/JobPage" && context.Request.Method == HttpMethods.Post) { // 重置流位置到开头,准备读取 responseBodyStream.Seek(0, SeekOrigin.Begin); // 读取流内容 var responseContent = await new StreamReader(responseBodyStream).ReadToEndAsync(); bool isResultTrue = false; try { // 反序列化JSON,判断result字段 var resultObj = JsonSerializer.Deserialize<dynamic>(responseContent); isResultTrue = resultObj?.result == true; } catch (JsonException) { // 反序列化失败时默认设为false,可根据需求调整 isResultTrue = false; } // 实现目标判断逻辑 if (isResultTrue) { Console.WriteLine("post jobpage且result为true"); // 这里可以添加你需要执行的逻辑 } // 重置流位置,将内容写回原始流 responseBodyStream.Seek(0, SeekOrigin.Begin); await responseBodyStream.CopyToAsync(originalResponseBody); } else { // 非目标请求,直接将内容写回原始流 responseBodyStream.Seek(0, SeekOrigin.Begin); await responseBodyStream.CopyToAsync(originalResponseBody); } } finally { // 恢复原始响应流 context.Response.Body = originalResponseBody; } } }
补充说明
- 示例使用
System.Text.Json进行JSON反序列化,若项目使用Newtonsoft.Json,可替换为对应的反序列化逻辑 - 增加了反序列化异常处理,避免因返回内容不符合预期JSON格式导致程序出错
- 最终确保将响应内容写回原始流,不会影响客户端正常接收响应
内容的提问来源于stack exchange,提问作者Batu han
相关产品推荐
相关产品推荐

