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
- Upgrade Senparc.Weixin.Work so the new ContactChangeType member is modeled and dispatched
- Override OnEventRequestAsync (or OnEvent_ChangeContactBaseRequestAsync) in a derived handler to catch and handle the new ChangeType
- 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
- Watch WeCom release notes for new change_contact sub-events
- Return 'success' for unhandled events so callbacks are not retried
- Pin a recent Senparc.Weixin.Work version in CI
- Log ChangeType before dispatching
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
- 未知的外部联系人事件Event.CHANGE_EXTERNAL_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/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)