JeffreySu/WeiXinMPSDK · error · UnknownRequestMsgTypeException

未知的Event.change_contact下属请求信息

Error message

未知的Event.change_contact下属请求信息

What it means

Inside OnEventRequestAsync, Event.change_contact callbacks are further dispatched by ContactChangeType (create_user, update_user, delete_user, update_tag, etc.). An unrecognized ChangeType falls into the default case and throws UnknownRequestMsgTypeException. The library enumerates only the change_contact sub-types it models.

Solutions

  1. Upgrade Senparc.Weixin.Work so the new ContactChangeType member is modeled and dispatched
  2. Override OnEventRequestAsync (or OnEvent_ChangeContactBaseRequestAsync) in a derived handler to catch and handle the new ChangeType
  3. Catch UnknownRequestMsgTypeException at the handler boundary, log ChangeType, and return an empty success response to WeCom so the callback is not endlessly retried

Example fix

// before
var response = await handler.OnEventRequestAsync(eventMessage);
// after
try { var response = await handler.OnEventRequestAsync(eventMessage); }
catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, "Unhandled change_contact ChangeType"); return "success"; }
Defensive patterns

Strategy: try-catch

Validate before calling

if (eventMessage.Event != Event.change_contact || !Enum.IsDefined(typeof(ContactChangeType), ((dynamic)eventMessage).ChangeType)) { return null; }

Type guard

bool IsKnownChangeContactEvent(IRequestMessageEventBase e) => e is RequestMessageEvent_Change_Contact_Base c && Enum.IsDefined(typeof(ContactChangeType), c.ChangeType);

Try / catch

try { response = await handler.OnEventRequestAsync(evt); } catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, "Unhandled change_contact ChangeType"); return "success"; }

Prevention

When it happens

Trigger: A WeCom 'change_contact' event callback arrives whose ChangeType (e.g. a newly added sub-type like 'update_user_chat') has no case in the switch — usually after Tencent introduces a new change_contact sub-event.

Common situations: WeCom platform update adds a new contact change sub-event; decrypted callback XML carries an unexpected ChangeType; test fixtures with hand-written ChangeType values.

Related errors


AI-assisted analysis of JeffreySu/WeiXinMPSDK@be573f6f94 (2026-09-12). Data as JSON: /api/errors/ca5b131c2c6419b5. Report an issue: GitHub.

Appendix: source

Thrown at src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs:304

                                    RequestMessage as RequestMessageEvent_Change_Contact_Party_Create);
                            break;
                        case ContactChangeType.update_party:
                            responseMessage = await
                                OnEvent_ChangeContactUpdatePartyRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_Contact_Party_Update);
                            break;
                        case ContactChangeType.delete_party:
                            responseMessage = await
                                OnEvent_ChangeContactDeletePartyRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_Contact_Party_Base);
                            break;
                        case ContactChangeType.update_tag:
                            responseMessage = await
                                OnEvent_ChangeContactUpdateTagRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_Contact_Tag_Update);
                            break;
                        default:
                            throw new UnknownRequestMsgTypeException("未知的Event.change_contact下属请求信息", null);
                    }

                    break;
                //外部联系人事件相关
                case Event.CHANGE_EXTERNAL_CONTACT:
                    var cecRequestMessage = RequestMessage as IRequestMessageEvent_Change_ExternalContact_Base;

                    switch (cecRequestMessage.ChangeType)
                    {
                        case ExternalContactChangeType.add_external_contact:
                            responseMessage = await
                                OnEvent_ChangeExternalContactAddRequestAsync(
                                    RequestMessage as RequestMessageEvent_Change_ExternalContact_Add);
                            break;
                        case ExternalContactChangeType.edit_external_contact:
                            responseMessage = await OnEvent_ChangeExternalContactUpdateRequestAsync(
                                requestMessage as RequestMessageEvent_Change_ExternalContact_Modified);
                            break;

View on GitHub (pinned to be573f6f94)