JeffreySu/WeiXinMPSDK · error · WeixinException
执行WeixinResult时提供的MessageHandler不能为Null!
Error message
执行WeixinResult时提供的MessageHandler不能为Null!
What it means
WeixinResult.ExecuteResult (sync MVC) writes base.Content to the response, or delegates to an IMessageHandler's FinalResponseDocument when Content is null. If both Content and _messageHandlerDocument are null it throws WeixinException, since the result would produce an empty WeChat reply. It flags an incorrectly configured WeixinResult.
Solutions
- Return WeixinResult with a string: return new WeixinResult("success"); for empty acknowledgements.
- Provide an executed IMessageHandler: new WeixinResult(messageHandler) after handler.Execute().
- Audit all controller return paths so every branch sets Content or a MessageHandler.
- Catch/log WeixinException at the filter level to pinpoint which WeChat endpoint is misconfigured.
Example fix
// before
if (requestMsg is TextRequestMessage)
return new WeixinResult(); // null path
// after
if (requestMsg is TextRequestMessage)
return new WeixinResult("处理成功"); Defensive patterns
Strategy: try-catch
Validate before calling
if (string.IsNullOrEmpty(result.Content) && result.MessageHandlerDocument == null)
return new WeixinResult("success"); // safe default acknowledgement Type guard
static bool HasReply(WeixinResult r) =>
!string.IsNullOrEmpty(r.Content) || r.MessageHandlerDocument != null; Try / catch
try { return weixinResult; }
catch (WeixinException ex) { logger.LogError(ex, "WeixinResult built without content/handler"); return new WeixinResult("success"); } Prevention
- Default to returning WeixinResult("success") on unhandled message types
- Audit every branch that builds a WeixinResult
- Execute the MessageHandler before passing it to the result
When it happens
Trigger: Returning new WeixinResult() or new WeixinResult((string)null) from a controller without setting MessageHandler, so ExecuteResult has neither content nor a handler.
Common situations: Customer-service/message controllers where the reply is built conditionally but a code path leaves both fields null; sample code copied without the handler setup; returning WeixinResult for an unhandled message type.
Related errors
- 执行WeixinResult时提供的MessageHandler不能为Null!
- 注册委托容量必须大于 0。
- 当前已有 个注册委托,不能把容量降低到 。
- 注册委托数量已达到上限 ,请先注销不再使用的账号或提高 MaximumCount。
- 注册委托数量已达到上限 。
AI-assisted analysis of JeffreySu/WeiXinMPSDK@be573f6f94 (2026-09-12).
Data as JSON: /api/errors/6c1c621ca847da52.
Report an issue: GitHub.
Appendix: source
Thrown at src/Senparc.Weixin.AspNet/Results/WeixinResult.cs:116
{
return null;
}
}
set { base.Content = value; }
}
#if NET462
public override void ExecuteResult(ControllerContext context)
#else
public override void ExecuteResult(ActionContext context)
#endif
{
if (base.Content == null)
{
//使用IMessageHandler输出
if (_messageHandlerDocument == null)
{
throw new Senparc.Weixin.Exceptions.WeixinException("执行WeixinResult时提供的MessageHandler不能为Null!", null);
}
if (_messageHandlerDocument.FinalResponseDocument == null)
{
//throw new Senparc.Weixin.MP.WeixinException("ResponseMessage不能为Null!", null);
}
else
{
#if NET462
context.HttpContext.Response.ClearContent();
context.HttpContext.Response.ContentType = "text/xml";
_messageHandlerDocument.FinalResponseDocument.Save(context.HttpContext.Response.OutputStream);
#else
//context.HttpContext.Response.ClearContent();
context.HttpContext.Response.ContentType = "text/xml";
_messageHandlerDocument.FinalResponseDocument.Save(context.HttpContext.Response.Body);
#endifView on GitHub (pinned to be573f6f94)