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>对象,而非预期的字符串结果。
修复方案
- 移除
PingHandler中递归调用mediator.Send的代码,直接返回目标结果 - 将控制器的
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
相关产品推荐
相关产品推荐

