JeffreySu/WeiXinMPSDK · error · WeixinException

RequestMessage转换出错!MsgType和InfoType都不存在!,XML:

Error message

RequestMessage转换出错!MsgType和InfoType都不存在!,XML:{0}

What it means

The incoming Work callback XML contains neither a <MsgType> nor an <InfoType> element, so RequestMessageFactory.GetRequestEntity cannot determine which request entity to build and throws WeixinException with the raw XML.

Solutions

  1. Verify the endpoint only accepts POSTs from WeChat and route health checks/probes elsewhere.
  2. Log the XML from the exception to see what was actually posted.
  3. Ensure WeChat server URL verification (echostr) is handled before message parsing.
  4. Catch WeixinException in the callback and return 'success' (or a safe ack) to stop WeChat retry storms.
  5. Check proxies/CDNs aren't stripping or truncating the XML body.

Example fix

// before
var msg = RequestMessageFactory.GetRequestEntity(...); // throws if MsgType missing
// after
try
{
    var msg = RequestMessageFactory.GetRequestEntity(...);
}
catch (WeixinException ex)
{
    Logger.Warn("Non-message post to callback: " + ex.Message);
    return "success";
}
Defensive patterns

Strategy: try-catch

Validate before calling

var doc = new XmlDocument();
doc.LoadXml(rawXml);
var hasType = doc.SelectSingleNode("//MsgType") != null || doc.SelectSingleNode("//InfoType") != null;
if (!hasType)
{
    Logger.Warn("Not a WeChat message post: " + rawXml);
    return "success";
}

Try / catch

try
{
    var msg = RequestMessageFactory.GetRequestEntity(...);
}
catch (WeixinException ex)
{
    Logger.Warn("Callback without MsgType/InfoType: " + ex.Message);
    return "success";
}

Prevention

When it happens

Trigger: Posting callback XML without a MsgType/InfoType node: empty or truncated bodies, non-message posts hitting the callback URL (e.g. URL verification handled incorrectly or probes), or gateways stripping fields.

Common situations: Misconfigured callback URL receiving traffic other than WeChat pushes (health checks, scanners); broken reverse proxy truncating the body; WeChat server verification GET/POST reaching a message endpoint.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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

Appendix: source

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

                                    break;
                                default:
                                    requestMessage = new RequestMessageEvent_Change_ExternalContact_Base();
                                    break;
                            }
                            break;
                        default:
                            throw new UnknownRequestMsgTypeException(string.Format("InfoType:{0} 在RequestMessageFactory中没有对应的处理程序!", infoType), new ArgumentOutOfRangeException());//为了能够对类型变动最大程度容错(如微信目前还可以对公众账号suscribe等未知类型,但API没有开放),建议在使用的时候catch这个异常
                    }
                    EntityHelper.FillEntityWithXml(requestMessage, doc);
                }
                catch (ArgumentException ex)
                {
                    throw new WeixinException(string.Format("RequestMessage转换异常!InfoType类型存在的情况下无法处理!,XML:{0}", doc.ToString()), ex);
                }
            }
            else
            {
                throw new WeixinException(string.Format("RequestMessage转换出错!MsgType和InfoType都不存在!,XML:{0}", doc.ToString()));
            }

            return requestMessage;
        }


        /// <summary>
        /// 获取XDocument转换后的IRequestMessageBase实例。
        /// 如果MsgType不存在,抛出UnknownRequestMsgTypeException异常
        /// </summary>
        /// <returns></returns>
        public static IWorkRequestMessageBase GetRequestEntity<TMC>(TMC messageContext, string xml)
            where TMC : class, IMessageContext<IWorkRequestMessageBase, IWorkResponseMessageBase>, new()
        {
            return GetRequestEntity(messageContext, XDocument.Parse(xml));
        }

        /// <summary>

View on GitHub (pinned to be573f6f94)