{"record":{"id":"a22139a6074e8bd3","repo":"JeffreySu/WeiXinMPSDK","slug":"event-change-external-contact","errorCode":null,"errorMessage":"未知的外部联系人事件Event.CHANGE_EXTERNAL_CONTACT下属请求信息","messagePattern":"未知的外部联系人事件Event\\.CHANGE_EXTERNAL_CONTACT下属请求信息","errorType":"exception","errorClass":"UnknownRequestMsgTypeException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs","lineNumber":347,"sourceCode":"                            responseMessage = await\n                                OnEvent_ChangeExternalContactDelRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_ExternalContact_Del);\n                            break;\n                        case ExternalContactChangeType.del_follow_user:\n                            responseMessage = await OnEvent_ChangeExternalContactDelFollowUserRequestAsync(\n                                RequestMessage as RequestMessageEvent_Change_ExternalContact_Del_FollowUser);\n                            break;\n                        case ExternalContactChangeType.transfer_fail:\n                            responseMessage = await OnEvent_ChangeExternalContactTransferFailRequestAsync(\n                                RequestMessage as RequestMessageEvent_Change_ExternalContact_Transfer_Fail);\n                            break;\n                        case ExternalContactChangeType.msg_audit_approved:\n                            responseMessage = await\n                                OnEvent_ChangeExternalContactMsgAuditAsync(\n                                    RequestMessage as RequestMessageEvent_Change_ExternalContact_MsgAudit);\n                            break;\n                        default:\n                            throw new UnknownRequestMsgTypeException(\"未知的外部联系人事件Event.CHANGE_EXTERNAL_CONTACT下属请求信息\",\n                                null);\n                    }\n\n                    break;\n                case Event.CHANGE_EXTERNAL_CHAT: //客户群变更事件\n                    var cechat = RequestMessage as RequestMessageEvent_Change_External_Chat_Base;\n\n                    switch (cechat.ChangeType)\n                    {\n                        case ExternalChatChangeType.create:\n                            responseMessage = await\n                                OnEvent_ChangeExternalChatCreateRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_External_Chat_Create);\n                            break;\n                        case ExternalChatChangeType.update:\n                            responseMessage = await\n                                OnEvent_ChangeExternalChatUpdateRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_External_Chat_Update);","sourceCodeStart":329,"sourceCodeEnd":365,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs#L329-L365","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nvar response = await handler.BuildResponseMessageAsync();\n// after\ntry { var response = await handler.BuildResponseMessageAsync(); }\ncatch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, \"Unhandled change_external_contact ChangeType\"); return new WeixinEmptyResult(); }","handlingStrategy":"try-catch","validationCode":"if (!Enum.IsDefined(typeof(ExternalContactChangeType), cecEvent.ChangeType)) { return null; }","typeGuard":"bool IsKnownExternalContactChange(RequestMessageEvent_Change_External_Contact_Base e) => Enum.IsDefined(typeof(ExternalContactChangeType), e.ChangeType);","tryCatchPattern":"try { response = await handler.BuildResponseMessageAsync(); } catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, \"Unhandled external-contact ChangeType\"); return new WeixinEmptyResult(); }","preventionTips":["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"],"tags":["wechat-work","external-contact","unknown-event"],"backgroundTag":"unsupported-enum-value","analyzedSha":"be573f6f94bdbf718dd5f6cdecb137fbc7ff651e","analyzedAt":"2026-09-12T10:01:50.733Z","contentChangedAt":"2026-09-12T10:01:50.733Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}