You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6 MVC:如何在中间件中读取控制器返回的JSON数据

实现中间件读取控制器返回的JSON结果并判断

问题说明

已实现QuartzStopStartMiddleware中间件,要求当请求路径为/Home/JobPage且请求方法为POST时,额外判断控制器返回的JSON中result字段是否为true,以此作为if判断的第三个条件。

解决方案

默认情况下HttpContext.Response.Body是只读流,无法直接读取返回内容,需要通过替换流的方式实现读取,具体步骤如下:

  1. 在调用后续中间件前,将Response.Body替换为可读写的MemoryStream,同时保存原始流
  2. 执行后续中间件/控制器逻辑
  3. 重置MemoryStream位置,读取返回的JSON内容
  4. 反序列化JSON并判断result字段值
  5. 将读取的内容写回原始流,保证响应能正常返回给客户端

修改后的中间件代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:10:12