JeffreySu/WeiXinMPSDK · error · UnknownRequestMsgTypeException
未知的外部联系人事件Event.CHANGE_EXTERNAL_CONTACT下属请求信息
Error message
未知的外部联系人事件Event.CHANGE_EXTERNAL_CONTACT下属请求信息
What it means
OnEventRequestAsync dispatches Event.CHANGE_EXTERNAL_CONTACT callbacks by ExternalContactChangeType (add_external_contact, edit_external_contact, del_external_contact, transfer_fail, msg_audit_approved, etc.). A ChangeType with no matching case throws UnknownRequestMsgTypeException, because the library only handles the external-contact sub-events it models.
Solutions
- Upgrade the Senparc.Weixin.Work package so all current ExternalContactChangeType values are supported
- Override the external-contact dispatch in a derived handler and add a case for the missing ChangeType
- Catch UnknownRequestMsgTypeException around handler execution and log the ChangeType, replying 'success' to WeCom to stop callback retries
Example fix
// before
var response = await handler.BuildResponseMessageAsync();
// after
try { var response = await handler.BuildResponseMessageAsync(); }
catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, "Unhandled change_external_contact ChangeType"); return new WeixinEmptyResult(); } Defensive patterns
Strategy: try-catch
Validate before calling
if (!Enum.IsDefined(typeof(ExternalContactChangeType), cecEvent.ChangeType)) { return null; } Type guard
bool IsKnownExternalContactChange(RequestMessageEvent_Change_External_Contact_Base e) => Enum.IsDefined(typeof(ExternalContactChangeType), e.ChangeType);
Try / catch
try { response = await handler.BuildResponseMessageAsync(); } catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, "Unhandled external-contact ChangeType"); return new WeixinEmptyResult(); } Prevention
- Upgrade the library before enabling new WeCom external-contact features
- Restrict the app's callback event scope to events you handle
- Log the raw ChangeType string for unknown events
- Reply 'success' to unmodeled events
When it happens
Trigger: A 'change_external_contact' callback whose ChangeType is not in the handled switch (e.g. a sub-type introduced by WeCom after your library version, or 'del_follow_user' on an old version) reaches OnEventRequestAsync.
Common situations: Older Senparc.Weixin.Work versions encountering newer WeCom external-contact sub-events (e.g. msg_audit_approved added later); misconfigured callback URLs receiving events for features the app doesn't model; test payloads with misspelled ChangeType.
Related errors
- 未知的Event.change_contact下属请求信息
- 未知的企业客户标签变更事件Event.CHANGE_EXTERNAL_Tag下属请求信息
- 未知的客户群变更事件Event.CHANGE_EXTERNAL_CHAT下属请求信息
- 未知的Event下属请求信息
- 未知的InfoType请求类型
AI-assisted analysis of JeffreySu/WeiXinMPSDK@be573f6f94 (2026-09-12).
Data as JSON: /api/errors/a22139a6074e8bd3.
Report an issue: GitHub.
Appendix: source
Thrown at src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs:347
responseMessage = await
OnEvent_ChangeExternalContactDelRequestAsync(
RequestMessage as RequestMessageEvent_Change_ExternalContact_Del);
break;
case ExternalContactChangeType.del_follow_user:
responseMessage = await OnEvent_ChangeExternalContactDelFollowUserRequestAsync(
RequestMessage as RequestMessageEvent_Change_ExternalContact_Del_FollowUser);
break;
case ExternalContactChangeType.transfer_fail:
responseMessage = await OnEvent_ChangeExternalContactTransferFailRequestAsync(
RequestMessage as RequestMessageEvent_Change_ExternalContact_Transfer_Fail);
break;
case ExternalContactChangeType.msg_audit_approved:
responseMessage = await
OnEvent_ChangeExternalContactMsgAuditAsync(
RequestMessage as RequestMessageEvent_Change_ExternalContact_MsgAudit);
break;
default:
throw new UnknownRequestMsgTypeException("未知的外部联系人事件Event.CHANGE_EXTERNAL_CONTACT下属请求信息",
null);
}
break;
case Event.CHANGE_EXTERNAL_CHAT: //客户群变更事件
var cechat = RequestMessage as RequestMessageEvent_Change_External_Chat_Base;
switch (cechat.ChangeType)
{
case ExternalChatChangeType.create:
responseMessage = await
OnEvent_ChangeExternalChatCreateRequestAsync(
RequestMessage as RequestMessageEvent_Change_External_Chat_Create);
break;
case ExternalChatChangeType.update:
responseMessage = await
OnEvent_ChangeExternalChatUpdateRequestAsync(
RequestMessage as RequestMessageEvent_Change_External_Chat_Update);View on GitHub (pinned to be573f6f94)