{"record":{"id":"ca5b131c2c6419b5","repo":"JeffreySu/WeiXinMPSDK","slug":"event-change-contact","errorCode":null,"errorMessage":"未知的Event.change_contact下属请求信息","messagePattern":"未知的Event\\.change_contact下属请求信息","errorType":"exception","errorClass":"UnknownRequestMsgTypeException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs","lineNumber":304,"sourceCode":"                                    RequestMessage as RequestMessageEvent_Change_Contact_Party_Create);\n                            break;\n                        case ContactChangeType.update_party:\n                            responseMessage = await\n                                OnEvent_ChangeContactUpdatePartyRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_Contact_Party_Update);\n                            break;\n                        case ContactChangeType.delete_party:\n                            responseMessage = await\n                                OnEvent_ChangeContactDeletePartyRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_Contact_Party_Base);\n                            break;\n                        case ContactChangeType.update_tag:\n                            responseMessage = await\n                                OnEvent_ChangeContactUpdateTagRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_Contact_Tag_Update);\n                            break;\n                        default:\n                            throw new UnknownRequestMsgTypeException(\"未知的Event.change_contact下属请求信息\", null);\n                    }\n\n                    break;\n                //外部联系人事件相关\n                case Event.CHANGE_EXTERNAL_CONTACT:\n                    var cecRequestMessage = RequestMessage as IRequestMessageEvent_Change_ExternalContact_Base;\n\n                    switch (cecRequestMessage.ChangeType)\n                    {\n                        case ExternalContactChangeType.add_external_contact:\n                            responseMessage = await\n                                OnEvent_ChangeExternalContactAddRequestAsync(\n                                    RequestMessage as RequestMessageEvent_Change_ExternalContact_Add);\n                            break;\n                        case ExternalContactChangeType.edit_external_contact:\n                            responseMessage = await OnEvent_ChangeExternalContactUpdateRequestAsync(\n                                requestMessage as RequestMessageEvent_Change_ExternalContact_Modified);\n                            break;","sourceCodeStart":286,"sourceCodeEnd":322,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.Work/Senparc.Weixin.Work/MessageHandlers/Async/WorkMessageHandler.Async.cs#L286-L322","documentation":"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.","triggerScenarios":"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.","commonSituations":"WeCom platform update adds a new contact change sub-event; decrypted callback XML carries an unexpected ChangeType; test fixtures with hand-written ChangeType values.","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"],"exampleFix":"// before\nvar response = await handler.OnEventRequestAsync(eventMessage);\n// after\ntry { var response = await handler.OnEventRequestAsync(eventMessage); }\ncatch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, \"Unhandled change_contact ChangeType\"); return \"success\"; }","handlingStrategy":"try-catch","validationCode":"if (eventMessage.Event != Event.change_contact || !Enum.IsDefined(typeof(ContactChangeType), ((dynamic)eventMessage).ChangeType)) { return null; }","typeGuard":"bool IsKnownChangeContactEvent(IRequestMessageEventBase e) => e is RequestMessageEvent_Change_Contact_Base c && Enum.IsDefined(typeof(ContactChangeType), c.ChangeType);","tryCatchPattern":"try { response = await handler.OnEventRequestAsync(evt); } catch (UnknownRequestMsgTypeException ex) { _logger.LogWarning(ex, \"Unhandled change_contact ChangeType\"); return \"success\"; }","preventionTips":["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"],"tags":["wechat-work","change-contact-event","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"}