{"record":{"id":"6c1c621ca847da52","repo":"JeffreySu/WeiXinMPSDK","slug":"weixinresult-messagehandler-null-6c1c62","errorCode":null,"errorMessage":"执行WeixinResult时提供的MessageHandler不能为Null！","messagePattern":"执行WeixinResult时提供的MessageHandler不能为Null！","errorType":"exception","errorClass":"WeixinException","httpStatus":null,"severity":"error","filePath":"src/Senparc.Weixin.AspNet/Results/WeixinResult.cs","lineNumber":116,"sourceCode":"                {\n                    return null;\n                }\n            }\n            set { base.Content = value; }\n        }\n\n#if NET462\n        public override void ExecuteResult(ControllerContext context)\n#else\n        public override void ExecuteResult(ActionContext context)\n#endif\n        {\n            if (base.Content == null)\n            {\n                //使用IMessageHandler输出\n                if (_messageHandlerDocument == null)\n                {\n                    throw new Senparc.Weixin.Exceptions.WeixinException(\"执行WeixinResult时提供的MessageHandler不能为Null！\", null);\n                }\n\n                if (_messageHandlerDocument.FinalResponseDocument == null)\n                {\n                    //throw new Senparc.Weixin.MP.WeixinException(\"ResponseMessage不能为Null！\", null);\n                }\n                else\n                {\n#if NET462\n                    context.HttpContext.Response.ClearContent();\n                    context.HttpContext.Response.ContentType = \"text/xml\";\n                    _messageHandlerDocument.FinalResponseDocument.Save(context.HttpContext.Response.OutputStream);\n#else\n                    //context.HttpContext.Response.ClearContent();\n                    context.HttpContext.Response.ContentType = \"text/xml\";\n                    _messageHandlerDocument.FinalResponseDocument.Save(context.HttpContext.Response.Body);\n\n#endif","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/JeffreySu/WeiXinMPSDK/blob/be573f6f94bdbf718dd5f6cdecb137fbc7ff651e/src/Senparc.Weixin.AspNet/Results/WeixinResult.cs#L98-L134","documentation":"WeixinResult.ExecuteResult (sync MVC) writes base.Content to the response, or delegates to an IMessageHandler's FinalResponseDocument when Content is null. If both Content and _messageHandlerDocument are null it throws WeixinException, since the result would produce an empty WeChat reply. It flags an incorrectly configured WeixinResult.","triggerScenarios":"Returning new WeixinResult() or new WeixinResult((string)null) from a controller without setting MessageHandler, so ExecuteResult has neither content nor a handler.","commonSituations":"Customer-service/message controllers where the reply is built conditionally but a code path leaves both fields null; sample code copied without the handler setup; returning WeixinResult for an unhandled message type.","solutions":["Return WeixinResult with a string: return new WeixinResult(\"success\"); for empty acknowledgements.","Provide an executed IMessageHandler: new WeixinResult(messageHandler) after handler.Execute().","Audit all controller return paths so every branch sets Content or a MessageHandler.","Catch/log WeixinException at the filter level to pinpoint which WeChat endpoint is misconfigured."],"exampleFix":"// before\nif (requestMsg is TextRequestMessage)\n    return new WeixinResult(); // null path\n// after\nif (requestMsg is TextRequestMessage)\n    return new WeixinResult(\"处理成功\");","handlingStrategy":"try-catch","validationCode":"if (string.IsNullOrEmpty(result.Content) && result.MessageHandlerDocument == null)\n    return new WeixinResult(\"success\"); // safe default acknowledgement","typeGuard":"static bool HasReply(WeixinResult r) =>\n    !string.IsNullOrEmpty(r.Content) || r.MessageHandlerDocument != null;","tryCatchPattern":"try { return weixinResult; }\ncatch (WeixinException ex) { logger.LogError(ex, \"WeixinResult built without content/handler\"); return new WeixinResult(\"success\"); }","preventionTips":["Default to returning WeixinResult(\"success\") on unhandled message types","Audit every branch that builds a WeixinResult","Execute the MessageHandler before passing it to the result"],"tags":["csharp","aspnet","weixin","mvc"],"backgroundTag":"null-argument","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"}