0

被动回复模块 后台报Failed to compare two elements in the array.

微信开发 · y978527977 · 查看 43 次 · 于 20天前

环境:.net6 WebApi
报错信息:
[2024-02-02 16:52:33] [Error] [Microsoft.AspNetCore.Server.Kestrel] : Connection id "0HN13PGB71KF8", Request id "0HN13PGB71KF8:00000002": An unhandled exception was thrown by the application.System.InvalidOperationException: Failed to compare two elements in the array.
---> System.NullReferenceException: Object reference not set to an instance of an object.
  at Senparc.Weixin.Tencent.WXBizMsgCrypt.DictionarySort.Compare(Object oLeft, Object oRight)
  at System.Array.SorterObjectArray.InsertionSort(Int32 lo, Int32 hi)
  at System.Array.SorterObjectArray.IntroSort(Int32 lo, Int32 hi, Int32 depthLimit)
  at System.Array.SorterObjectArray.IntrospectiveSort(Int32 left, Int32 length)
  --- End of inner exception stack trace ---
  at System.Array.SorterObjectArray.IntrospectiveSort(Int32 left, Int32 length)
  at System.Array.Sort(Array keys, Array items, Int32 index, Int32 length, IComparer comparer)
  at System.Collections.ArrayList.Sort(Int32 index, Int32 count, IComparer comparer)
  at Senparc.Weixin.Tencent.WXBizMsgCrypt.GenarateSinature(String sToken, String sTimeStamp, String sNonce, String sMsgEncrypt, String& sMsgSignature)
  at Senparc.Weixin.Tencent.WXBizMsgCrypt.VerifySignature(String sToken, String sTimeStamp, String sNonce, String sMsgEncrypt, String sSigture)
  at Senparc.Weixin.Tencent.WXBizMsgCrypt.DecryptMsg(String sMsgSignature, String sTimeStamp, String sNonce, String sPostData, String& sMsg)
  at Senparc.Weixin.MP.MessageHandlers.MessageHandler`1.Init(XDocument postDataDocument, IEncryptPostModel postModel)
  at Senparc.NeuChar.MessageHandlers.MessageHandler`3.CommonInitialize(XDocument postDataDocument, Int32 maxRecordCount, IEncryptPostModel postModel, Boolean onlyAllowEncryptMessage, IServiceProvider serviceProvider)
  at Senparc.NeuChar.MessageHandlers.MessageHandler`3..ctor(Stream inputStream, IEncryptPostModel postModel, Int32 maxRecordCount, Boolean onlyAllowEncryptMessage, IServiceProvider serviceProvider)
  at Senparc.Weixin.MP.MessageHandlers.MessageHandler`1..ctor(Stream inputStream, PostModel postModel, Int32 maxRecordCount, Boolean onlyAllowEncryptMessage, DeveloperInfo developerInfo, IServiceProvider serviceProvider)
  at JWTTest.Core.Service.CustomMessageHandler..ctor(Stream inputStream, PostModel postModel, Int32 maxRecordCount, Boolean onlyAllowEncryptMessage, IServiceProvider serviceProvider) in E:\项目文件\博客\Core\Service\CustomMessageHandler.cs:line 52
  at JWTTest.Controllers.PublicController.Post(PostModel postModel) in E:\项目文件\博客\Controllers\PublicController.cs:line 153
  at lambda_method6(Closure , Object )
  at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask`1 actionResultValueTask)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
  at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
  at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
  at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
  at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
  at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
  at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
  at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
  at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

源代码:
messageHandler = new CustomMessageHandler(await Request.GetRequestMemoryStreamAsync(), postModel, maxRecordCount);//接收消息(第一步)
       public CustomMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0, bool onlyAllowEncryptMessage = false, IServiceProvider serviceProvider = null)
           : base(inputStream, postModel, maxRecordCount, onlyAllowEncryptMessage, serviceProvider: serviceProvider)
       {
           //这里设置仅用于测试,实际开发可以在外部更全局的地方设置,
           //比如MessageHandler<MessageContext>.GlobalGlobalMessageContext.ExpireMinutes = 3。
           GlobalMessageContext.ExpireMinutes = 3;

           OnlyAllowEncryptMessage = true;//是否只允许接收加密消息,默认为 false
       }
跟示例代码一毛一样的,我什么都没动只是改了下配置
您尚未登录,请:网站登录 or 微信登录
共收到 3 条回复
0

y978527977 18天前

    Controller内容如下:
[Route("[controller]")]
   [ApiController]
public class PublicController : BaseController
   {
       public static readonly string Token = MpSetting.Token;//与微信公众账号后台的Token设置保持一致,区分大小写。
       public static readonly string EncodingAESKey = MpSetting.EncodingAESKey;//与微信公众账号后台的EncodingAESKey设置保持一致,区分大小写。
       public static readonly string AppId = MpSetting.WeixinAppId;//与微信公众账号后台的AppId设置保持一致,区分大小写。
       private readonly ILogger<PublicController> _logger;
       private readonly EmailService email;
       private readonly HttpClient http;
       /// <summary>
       ///
       /// </summary>
       /// <param name="db"></param>
       /// <param name="email"></param>
       /// <param name="loggerFactory"></param>
       /// <param name="httpClientFactory"></param>
       public PublicController(ApiDbContext db, EmailService email, ILoggerFactory loggerFactory, IHttpClientFactory httpClientFactory) : base(db)
       {
           this.email = email;
           _logger = loggerFactory.CreateLogger<PublicController>();
           http = httpClientFactory.CreateClient();
           http.Timeout = TimeSpan.FromSeconds(10););
       }
/// <summary>
/// 微信后台验证地址(使用Get),微信后台的“接口配置信息”的Url填写如:http://sdk.weixin.senparc.com/weixin
/// </summary>
[HttpGet]
public ActionResult Get([FromQuery] PostModel postModel, string echostr)
{
   if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
   {
       return Content(echostr); //返回随机字符串则表示验证通过
   }
   else
   {
       return Content("failed:" + postModel.Signature + "," + CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
           "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。");
   }
}

/// <summary>
/// 【异步方法】用户发送消息后,微信平台自动Post一个请求到这里,并等待响应XML。
/// </summary>
[HttpPost]
public async Task<ActionResult> Post([FromForm,FromQuery] PostModel postModel)
{
   //_logger.LogWarning($"{JsonConvert.SerializeObject(postModel)}");
   //if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
   //{
   //    return Content("参数错误!");
   //}
   _logger.LogInformation("开始打包用户消息");
   #region 打包 PostModel 信息

   postModel.Token = Token;//根据自己后台的设置保持一致
   postModel.EncodingAESKey = EncodingAESKey;//根据自己后台的设置保持一致
   postModel.AppId = AppId;//根据自己后台的设置保持一致(必须提供)

   #endregion
   _logger.LogInformation("打包用户消息结束");
   //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制(实际最大限制 99999)
   //注意:如果使用分布式缓存,不建议此值设置过大,如果需要储存历史信息,请使用数据库储存
   var maxRecordCount = 10;

   CustomMessageHandler messageHandler;

   //自定义MessageHandler,对微信请求的详细判断操作都在这里面。
   messageHandler = new CustomMessageHandler(await Request.GetRequestMemoryStreamAsync(), postModel, maxRecordCount);//接收消息(第一步)

   _logger.LogInformation("开始去重用户消息");
   #region 设置消息去重设置 + 优先调用同步、异步方法设置

   /* 如果需要添加消息去重功能,只需打开OmitRepeatedMessage功能,SDK会自动处理。
    * 收到重复消息通常是因为微信服务器没有及时收到响应,会持续发送2-5条不等的相同内容的 RequestMessage */
   messageHandler.OmitRepeatedMessage = false;//默认已经是开启状态,此处仅作为演示,也可以设置为 false 在本次请求中停用此功能

   //当同步方法被重写,且异步方法未被重写时,尝试调用同步方法
   messageHandler.DefaultMessageHandlerAsyncEvent = DefaultMessageHandlerAsyncEvent.SelfSynicMethod;
   #endregion
   _logger.LogInformation("去重用户消息结束");
   try
   {
       //messageHandler.SaveRequestMessageLog();//记录 Request 日志(可选)

       var ct = new CancellationToken();
       await messageHandler.ExecuteAsync(ct);//执行微信处理过程(关键,第二步)

       //messageHandler.SaveResponseMessageLog();//记录 Response 日志(可选)

       return new FixWeixinBugWeixinResult(messageHandler);//返回(第三步)
   }
   catch (Exception ex)
   {
       #region 异常处理
       WeixinTrace.Log("MessageHandler错误:{0}", ex.Message);
       _logger.LogError("MessageHandler错误:{0}", ex.Message);

       //using (TextWriter tw = new StreamWriter(ServerUtility.ContentRootMapPath("~/App_Data/Error_" + _getRandomFileName() + ".txt")))
       //{
       //    tw.WriteLine("ExecptionMessage:" + ex.Message);
       //    tw.WriteLine(ex.Source);
       //    tw.WriteLine(ex.StackTrace);
       //    //tw.WriteLine("InnerExecptionMessage:" + ex.InnerException.Message);

       //    if (messageHandler.ResponseDocument != null)
       //    {
       //        tw.WriteLine(messageHandler.ResponseDocument.ToString());
       //    }

       //    if (ex.InnerException != null)
       //    {
       //        tw.WriteLine("========= InnerException =========");
       //        tw.WriteLine(ex.InnerException.Message);
       //        tw.WriteLine(ex.InnerException.Source);
       //        tw.WriteLine(ex.InnerException.StackTrace);
       //    }

       //    tw.Flush();
       //    tw.Close();
       //}
       return Content("");
       #endregion
   }
}

我好像找到原因了,我的域名还没有备案所以未加入公众号白名单,测试号不用备案可以加入域名白名单。但是搞不懂报的这个错

0

Senparc 20天前

是否方便把整个 Controller 发上来一下?

0

y978527977 20天前

申请的测试号是正常的,服务号后台会报错


热门话题 更多 >>

EventLog access is not supported on this platform

FunctionWoo 6 个回复 • 查看 2056 次 • 66天前

sdk的配置文件更改位置

ylh0320 5 个回复 • 查看 1467 次 • 164天前

全局注册var app = builder.Build();中的 app报错

chenzezhao 1 个回复 • 查看 674 次 • 44天前

.net core 7 始终找不到UseSenparcWeixin方法

moose123 1 个回复 • 查看 52 次 • 20天前

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

阿贾克斯 0 个回复 • 查看 57 次 • 18天前

个人信息
QQ群
  • 1群:300313885 (2000人群 已满)
  • 2群:293958349 (1000人群 已满)
  • 3群(公众号):342319110 Senparc.Weixin.MPSDK 3群
  • 4群:372212092 (500人群 已满)
  • 5群:377815480 (1000人群 已满)
  • 6群:425898825 (1000人群 已满)
  • 7群:482942254 (500人群 已满)
  • 8群:106230270 (500人群 已满)
  • 9群:539061281 (500人群 已满)
  • 10群(分布式缓存):246860933 Senparc.Weixin.Cache SDK 10群
  • 11群:553198593 (500人群 已满)
  • 12群(小程序):108830388 (2000人群 已满)
  • 13群(开放平台):183424136 (500人群 已满)
  • 14群(视频学员):588231256 Senparc.Weixin SDK 14群
  • 15群(综合):289181996 (500人群 已满)
  • 16群(开放平台):860626938 (500人群 已满)
  • 17群(小程序):770615466 [17群 开放平台]SenparcSDK
  • NCF 技术交流群:147054579 SCF 开发交流群
微信开发宝典:《微信开发深度解析》

由 Senparc.Weixin SDK 作者耗时两年完成的微信开发图书《微信开发深度解析:公众号、小程序高效开发秘籍》已经出版!

历经2年精心雕琢,难得的“理论 + 实战案例 + 趟坑经验”总结,
从需求分析、策划,到账号申请、验证,再到全面的 API 及开发工具,
覆盖所有开发微信公众号(含订阅号、服务号和小程序)所需关键技能!

视频教程:《微信公众号+小程序快速开发》

由盛派课堂(盛派旗下独立教育品牌)制作,《微信开发深度解析》作者苏震巍先生主讲的《微信公众号+小程序快速开发》视频课程开课啦!

课程采用“理论+实战”的教学形式,结合部分《微信开发深度解析》内容,独立于书本,包含了更多的操作演示和案例展示,帮助大家从多个维度学习微信开发以及.NET开发过程中的诸多技巧。
课程包含两大部分:
1. 微信开发基础技能
2. 公众号及小程序案例实战
共计60课时,配有番外篇,目前视频已在网易云课堂上线。