{"record":{"id":"4a3df656749ecb39","repo":"JeffreySu/WeiXinMPSDK","slug":"responsemsgtype-0","errorCode":null,"errorMessage":"ResponseMsgType没有为 {0} 提供对应处理程序。","messagePattern":"ResponseMsgType没有为 (.+?) 提供对应处理程序。","errorType":"exception","errorClass":"UnknownRequestMsgTypeException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/WorkResponseMessageBase.cs","lineNumber":83,"sourceCode":"\t\t\t\t\t\tresponseMessage = new ResponseMessageNews();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ResponseMsgType.Image:\n\t\t\t\t\t\tresponseMessage = new ResponseMessageImage();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ResponseMsgType.Voice:\n\t\t\t\t\t\tresponseMessage = new ResponseMessageVoice();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ResponseMsgType.Video:\n\t\t\t\t\t\tresponseMessage = new ResponseMessageVideo();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase ResponseMsgType.MpNews:\n\t\t\t\t\t\tresponseMessage = new ResponseMessageMpNews();\n\t\t\t\t\t\tbreak;\n                    case ResponseMsgType.NoResponse:\n                        responseMessage = new WorkResponseMessageNoResponse();\n\t\t\t\t        break;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new UnknownRequestMsgTypeException(string.Format(\"ResponseMsgType没有为 {0} 提供对应处理程序。\", msgType), new ArgumentOutOfRangeException());\n\t\t\t\t}\n\n\t\t\t\tresponseMessage.ToUserName = requestMessage.FromUserName;\n\t\t\t\tresponseMessage.FromUserName = requestMessage.ToUserName;\n\t\t\t\tresponseMessage.CreateTime = SystemTime.Now; //使用当前最新时间\n\n\t\t\t}\n\t\t\tcatch (Exception ex)\n\t\t\t{\n\t\t\t\tthrow new WeixinException(\"CreateFromRequestMessage过程发生异常\", ex);\n\t\t\t}\n\n\t\t\treturn responseMessage;\n\t\t}\n\n\t\t/// <summary>\n\t\t/// 获取响应类型实例，并初始化\n\t\t/// </summary>","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.Work/Senparc.Weixin.Work/Entities/Response/WorkResponseMessageBase.cs#L65-L101","documentation":"CreateFromRequestMessage maps a ResponseMsgType enum value to a concrete response message class. When the enum value has no mapped case, the default branch throws UnknownRequestMsgTypeException (wrapping ArgumentOutOfRangeException) rather than silently returning a mismatched response type.","triggerScenarios":"Passing a ResponseMsgType that has no switch case in WorkResponseMessageBase.CreateFromRequestMessage — e.g. calling the generic CreateFromRequestMessage<T>() where the T type name parses to an unmapped enum member, or a library version where new enum values were added before the mapping was updated.","commonSituations":"Passing ResponseMsgType.Unknown or Success values to the factory; upgrading the SDK so new enum members exist while custom code paths still hit the old switch; reflection-based generic path with a misspelled response class name.","solutions":["Pass only supported ResponseMsgType values (Text, Image, News, MpNews, Video, Voice, Music, NoResponse, etc.) or handle those explicitly","When using CreateFromRequestMessage<T>(), ensure the response class name maps cleanly to a ResponseMsgType enum name (the mapping strips the 'ResponseMessage' prefix)","Wrap factory calls in try-catch for UnknownRequestMsgTypeException and fall back to building the response entity manually"],"exampleFix":"// before\nvar msg = WorkResponseMessageBase.CreateFromRequestMessage(request, (ResponseMsgType)99);\n// after\nResponseMsgType type = GetSafeResponseType(request);\nif (!Enum.IsDefined(typeof(ResponseMsgType), type))\n    return new WorkResponseMessageNoResponse();\nvar msg = WorkResponseMessageBase.CreateFromRequestMessage(request, type);","handlingStrategy":"try-catch","validationCode":"if (!Enum.IsDefined(typeof(ResponseMsgType), msgType))\n    return new WorkResponseMessageNoResponse();","typeGuard":"static bool IsSupportedResponseType(ResponseMsgType t) =>\n    t is ResponseMsgType.Text or ResponseMsgType.Image or ResponseMsgType.News\n        or ResponseMsgType.MpNews or ResponseMsgType.Video or ResponseMsgType.Voice\n        or ResponseMsgType.Music or ResponseMsgType.NoResponse;","tryCatchPattern":"try { var msg = WorkResponseMessageBase.CreateFromRequestMessage(request, msgType); }\ncatch (UnknownRequestMsgTypeException ex) { log.Warn(ex.Message); msg = new WorkResponseMessageNoResponse(); }","preventionTips":["Only pass explicitly mapped ResponseMsgType values into the factory","Keep response class names aligned with enum names when using the generic overload","Catch UnknownRequestMsgTypeException at the message pipeline boundary"],"tags":["enum","factory","message-type"],"backgroundTag":"invalid-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"}