JeffreySu/WeiXinMPSDK · error · WeixinException

RequestMessage转换出错!可能是MsgType不存在!,XML:

Error message

RequestMessage转换出错!可能是MsgType不存在!,XML:{0}

What it means

RequestMessageFactory.GetRequestEntity caught an ArgumentException while filling the parsed XML into the request message, which it interprets as the MsgType not being recognized/handled. The original XML is embedded in the WeixinException message for diagnosis.

Solutions

  1. Inspect the XML in the exception message and check the actual MsgType value.
  2. Upgrade Senparc.Weixin.Work to the latest version to pick up newly supported MsgTypes.
  3. Catch WeixinException in your callback entry point and log the raw XML instead of letting it 500.
  4. If the type is genuinely new, subclass/patch the factory or handle it before FillEntityWithXml.

Example fix

// before
var msg = WorkMessageFactory.GetRequestEntity(...) // throws on unknown MsgType
// after
try
{
    var msg = WorkMessageFactory.GetRequestEntity(postModel, encryptType, signature, timestamp, nonce, xml);
}
catch (WeixinException ex)
{
    Logger.Warn("Unknown Work callback XML: " + ex.Message);
    return new WeixinResult("success");
}
Defensive patterns

Strategy: try-catch

Validate before calling

var doc = new XmlDocument();
doc.LoadXml(rawXml);
var msgType = doc.SelectSingleNode("//MsgType")?.InnerText;
if (string.IsNullOrEmpty(msgType))
{
    Logger.Warn("Unknown/missing MsgType: " + rawXml);
    return "success";
}

Try / catch

try
{
    var msg = RequestMessageFactory.GetRequestEntity(...);
}
catch (WeixinException ex)
{
    Logger.Warn("Unconvertible Work XML: " + ex.Message);
    return new WeixinResult("success");
}

Prevention

When it happens

Trigger: Posting XML to the Work callback whose <MsgType> value does not map to any known RequestMessage entity, so EntityHelper.FillEntityWithXml throws ArgumentException inside GetRequestEntity.

Common situations: WeChat adding new message types the SDK version doesn't know; malformed/modified callback XML in tests or proxies; outdated Senparc.Weixin.Work package missing newer MsgType support.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of JeffreySu/WeiXinMPSDK@be573f6f94 (2026-09-12). Data as JSON: /api/errors/65432ebd57d219bb. Report an issue: GitHub.

Appendix: source

Thrown at src/Senparc.Weixin.Work/Senparc.Weixin.Work/RequestMessageFactory.cs:115

                    //获取消息类型
                    msgType = MsgTypeHelper.GetRequestMsgType(doc);

                    //自动获取对应类型的 RequestMessage
                    requestMessage = messageContext.GetRequestEntityMappingResult(msgType, doc) as WorkRequestMessageBase;

                    ////特殊对象处理(不使用底层 EntityHelper)
                    //if (requestMessage is RequestMessageEvent_SysApprovalChange)
                    //{
                    //    var requestXml = doc.Root.ToString();
                    //    XmlUtility.Deserialize<RequestMessageEvent_SysApprovalChange>(requestXml);
                    //}

                    //将 XML 内容填充到 requestMessage 中
                    EntityHelper.FillEntityWithXml(requestMessage, doc);
                }
                catch (ArgumentException ex)
                {
                    throw new WeixinException(string.Format("RequestMessage转换出错!可能是MsgType不存在!,XML:{0}", doc.ToString()), ex);
                }
            }
            else if (doc.Root.Element("InfoType") != null)
            {
                //第三方回调
                try
                {
                    infoType = Work.Helpers.MsgTypeHelper.GetThirdPartyInfo(doc);
                    switch (infoType)
                    {
                        case ThirdPartyInfo.SUITE_TICKET://推送suite_ticket协议
                            requestMessage = new RequestMessageInfo_Suite_Ticket();
                            break;
                        case ThirdPartyInfo.CHANGE_AUTH://变更授权的通知
                            requestMessage = new RequestMessageInfo_Change_Auth();
                            break;
                        case ThirdPartyInfo.CANCEL_AUTH://取消授权的通知
                            requestMessage = new RequestMessageInfo_Cancel_Auth();

View on GitHub (pinned to be573f6f94)