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

  1. Upgrade Senparc.Weixin.WxOpen so DefaultAsyncMethod covers all DefaultMessageHandlerAsyncEvent values
  2. Ensure DefaultMessageHandlerAsyncEvent is only set to DefaultMessageHandlerAsyncEvent.DefaultResponseMessage or SelfSynicMethod
  3. Override DefaultResponseMessageAsync() to handle new event types gracefully
  4. 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

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


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)