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

MediatR Ping示例调用时出现Stack overflow异常求助

MediatR Ping示例栈溢出问题排查

问题现象

调用Ping接口时出现栈溢出错误,错误日志重复260次:

info: Microsoft.Hosting.Lifetime[0]
Content root path: C:\S\Abhi.MediatR.SampleUsingControllers Stack overflow.

错误原因

核心问题出在PingHandler的Handle方法中:处理Ping请求时,你通过mediator.Send(new Ping())再次发起了新的Ping请求,触发处理器重复执行,形成无限递归调用,最终耗尽栈内存导致栈溢出。

另外控制器的Get方法未对异步的mediator.Send使用await,会直接返回Task<string>对象,而非预期的字符串结果。

修复方案

  1. 移除PingHandler中递归调用mediator.Send的代码,直接返回目标结果
  2. 将控制器的Get方法改为异步,并通过await等待mediator.Send的执行结果

修正后的代码示例

控制器代码

[Route("api/[controller]")]
[ApiController]
public class PingController : ControllerBase
{
    private readonly IMediator mediator;

    public PingController(IMediator mediator)
    {
        this.mediator = mediator;
    }

    [HttpGet]
    [Produces(typeof(string))]
    public async Task<IActionResult> Get()
    {
        try
        {
            var response = await mediator.Send(new Ping());
            return Ok(response);
        }
        catch (Exception ex)
        {
            return BadRequest($"Oops something went wrong, {ex}");
        }
    }
}

Ping处理器代码

public class PingHandler : IRequestHandler<Ping, string>
{
    public async Task<string> Handle(Ping request, CancellationToken cancellationToken)
    {
        return await Task.FromResult("Pong");
    }
}

补充说明

MediatR的注册方式builder.Services.AddMediatR(typeof(Program))或builder.Services.AddMediatR(Assembly.GetExecutingAssembly())均为正确写法,本次栈溢出问题与服务注册无关。

内容的提问来源于stack exchange,提问作者Abhijeet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 02:50:28