JeffreySu/WeiXinMPSDK · error · MessageHandlerException
DefaultMessageHandlerAsyncEvent 类型未作处理:
Error message
DefaultMessageHandlerAsyncEvent 类型未作处理:{base.DefaultMessageHandlerAsyncEvent.ToString()} What it means
DefaultAsyncMethod dispatches unhandled async message events either to DefaultResponseMessageAsync or to a synced sync method, based on base.DefaultMessageHandlerAsyncEvent. Any enum value outside those two throws MessageHandlerException('DefaultMessageHandlerAsyncEvent 类型未作处理').
Solutions
- Upgrade Senparc.Weixin.WxOpen so DefaultAsyncMethod covers all DefaultMessageHandlerAsyncEvent values
- Ensure DefaultMessageHandlerAsyncEvent is only set to DefaultMessageHandlerAsyncEvent.DefaultResponseMessage or SelfSynicMethod
- Override DefaultResponseMessageAsync() to handle new event types gracefully
- Override the specific OnEvent_XXXAsync methods (e.g. OnEvent_SecVodUploadRequestAsync) instead of relying on the default path
Example fix
// before
// base handler with no DefaultResponseMessageAsync override; unknown enum value set
messageHandler.DefaultMessageHandlerAsyncEvent = (DefaultMessageHandlerAsyncEvent)99;
// after
messageHandler.DefaultMessageHandlerAsyncEvent = DefaultMessageHandlerAsyncEvent.DefaultResponseMessage;
public override Task<IResponseMessageBase> DefaultResponseMessageAsync(IRequestMessageBase requestMessage)
=> Task.FromResult<IResponseMessageBase>(CreateResponseMessage<ResponseMessageText>()); Defensive patterns
Strategy: validation
Validate before calling
if (!Enum.IsDefined(typeof(DefaultMessageHandlerAsyncEvent), messageHandler.DefaultMessageHandlerAsyncEvent) || messageHandler.DefaultMessageHandlerAsyncEvent == (DefaultMessageHandlerAsyncEvent)99) { throw new InvalidOperationException("Unsupported DefaultMessageHandlerAsyncEvent"); } Type guard
bool IsSupported(DefaultMessageHandlerAsyncEvent e) => e == DefaultMessageHandlerAsyncEvent.DefaultResponseMessage || e == DefaultMessageHandlerAsyncEvent.SelfSynicMethod;
Try / catch
try { response = await handler.DefaultAsyncMethod(...); } catch (MessageHandlerException ex) { Log(ex); response = handler.CreateResponseMessage<ResponseMessageText>(); } Prevention
- Only assign DefaultMessageHandlerAsyncEvent.DefaultResponseMessage or SelfSynicMethod
- Always override DefaultResponseMessageAsync in custom handlers
- Keep SDK versions aligned across Senparc.* packages
- Override new OnEvent_XXXAsync methods when upgrading
When it happens
Trigger: An unhandled OnEvent_XXX async method is invoked (e.g. OnEvent_ChargeServiceQuotaNotifyRequestAsync, OnEvent_SecVodUploadRequestAsync, OnEvent_SecVodAuditRequestAsync, OnEvent_WxAliveFollowNotifyRequestAsync, OnEvent_WxAlivePushMessageNotifyRequestAsync, OnEvent_RetailRefundNotifyRequestAsync) while DefaultMessageHandlerAsyncEvent holds an unexpected enum value.
Common situations: Base class introduced a new enum member (e.g. via SDK upgrade) while the derived WxOpenMessageHandler's switch was not updated; custom message handler hierarchy overriding DefaultMessageHandlerAsyncEvent incorrectly.
Understand the failure class
Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.
Related errors
- MsgType: 在ResponseMessageFactory中没有对应的处理程序!
- sendType
- 未知的 PlatformType :
- 注册委托容量必须大于 0。
- 当前已有 个注册委托,不能把容量降低到 。
AI-assisted analysis of JeffreySu/WeiXinMPSDK@be573f6f94 (2026-09-12).
Data as JSON: /api/errors/84a37ebe10cae58d.
Report an issue: GitHub.
Appendix: source
Thrown at src/Senparc.Weixin.WxOpen/src/Senparc.Weixin.WxOpen/Senparc.Weixin.WxOpen/MessageHandlers/WxOpenMessageHandler.cs:297
/// <summary>
/// 自动判断默认异步方法调用(在没有override的情况下调用的默认方法)
/// </summary>
/// <param name="requestMessage">requestMessage</param>
/// <param name="syncMethod">同名的同步方法(DefaultMessageHandlerAsyncEvent值为SelfSynicMethod时调用)</param>
/// <returns></returns>
private async Task<IResponseMessageBase> DefaultAsyncMethod(IRequestMessageBase requestMessage, Func<IResponseMessageBase> syncMethod)
{
switch (base.DefaultMessageHandlerAsyncEvent)
{
case DefaultMessageHandlerAsyncEvent.DefaultResponseMessageAsync:
//返回默认信息
return await DefaultResponseMessageAsync(requestMessage).ConfigureAwait(false);
case DefaultMessageHandlerAsyncEvent.SelfSynicMethod:
//返回同步信息
return await Task.Run(syncMethod).ConfigureAwait(false);
default:
throw new MessageHandlerException($"DefaultMessageHandlerAsyncEvent 类型未作处理:{base.DefaultMessageHandlerAsyncEvent.ToString()}");
}
}
/// <summary>
/// 【异步方法】认返回消息(当任何OnXX消息没有被重写,都将自动返回此默认消息)
/// </summary>
public virtual async Task<IResponseMessageBase> DefaultResponseMessageAsync(IRequestMessageBase requestMessage)
{
return await Task.Run(() => DefaultResponseMessage(requestMessage)).ConfigureAwait(false);
}
/// <summary>
/// 执行微信请求
/// </summary>
public override async Task BuildResponseMessageAsync(CancellationToken cancellationToken)
{
#region NeuChar 执行过程
//var neuralSystem = NeuralSystem.Instance;View on GitHub (pinned to be573f6f94)