C#微信公众号开发之使用MessageHandler简化消息处理流程

作者:Jeffrey?Su 时间:2022-04-12 12:12:34 

微信公众平台对信息做了比较清晰的分类,最基本的包括请求(Request)和响应(Response)两大类信息,这两类信息有分为文字、语音、图片等格式。

这些类型在Senparc.Weixin.MP.dll SDK中以枚举的方式区分,同时根据严格命名规则命名了所有类型的RequestMessage和ResponseMessage。

但是基于枚举和类名的区分,势必会使用到switch或者反射这样复杂的代码,用于处理不同类型的微信信息。

为此,从v0.3.0起,Senparc.Weixin.MP开发了MessageHandler,对消息处理进行了封装(所以MessageHandler内部仍然使用了复杂但是高效的switch等判断手法),可以在使用SDK的时候轻松、简洁地处理各类信息,原本需要写入if或者switch判断数据类型,然后执行的代码块,现在都只需要写入到对应的方法中。

MessageHandler是一个抽象类,开发者可以在自己的项目中创建自己的类,继承并实现(重写)MessageHandler中提供的方法。

第一步,我们新建一个MyMessageHandler.cs,将MessageHandler作为基类并重写所有方法:

using System;
using System.IO;
using Senparc.Weixin.MP.MessageHandlers;
using Senparc.Weixin.MP.Entities;

namespace Senparc.Weixin.MP.Sample.CustomerMessageHandler
{
   public class MyMessageHandler : MessageHandler<MessageContext>
   {
       public MyMessageHandler(Stream inputStream)
           : base(inputStream)
       {

}
       public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
       {
           var responseMessage = this.CreateResponseMessage<ResponseMessageText>();//ResponseMessageText也可以是News等其他类型
           responseMessage.Content = "这条消息来自DefaultResponseMessage。";
           return responseMessage;
       }

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
       {
           //...
       }

public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
       {
           //...
       }

//更多没有重写的OnXX方法,将默认返回DefaultResponseMessage中的结果。
       ....
   }
}

上述代码中重写的方法对应了接收不同的Request类型(在MessageHandler.cs源文件中已有详细说明,根据命名规则也很好理解)。

构造函数的inputStream用于接收来自微信服务器的请求流(如果需要在外部处理,这里也可以传入XDocument)。

第二步,在不同的重写方法内,实现自己的方法。 比如我们对于文字(Text)信息进行这样的处理:

public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
       {
           //TODO:这里的逻辑可以交给Service处理具体信息,参考OnLocationRequest方法或/Service/LocationSercice.cs
           var responseMessage = CreateResponseMessage<ResponseMessageText>();
           responseMessage.Content =
               string.Format(
                   "您刚才发送了文字信息:{0}\r\n您还可以发送【位置】【图片】【语音】等类型的信息,查看不同格式的回复。\r\nSDK官方地址:http://weixin.senparc.com",
                   requestMessage.Content);
           return responseMessage;
       }

ResponseMessageBase.CreateFromRequestMessage方法在主页的readme.md中已经有说明,用于指定初始化特定类型的ResponseMessage。最终返回的responseMessage可以是基于IResponseMessageBase的任何类型。

第三步,在Action中使用MessageHandler(如果在Webforms里通常写在Page_Load事件中):

[HttpPost]
       [ActionName("Post")]
       public ActionResult Post(string signature, string timestamp, string nonce, string echostr)
       {
           if (!CheckSignature.Check(signature, timestamp, nonce, Token))
           {
               return Content("参数错误!");
           }

var messageHandler = new CustomerMessageHandler(Request.InputStream);
           messageHandler.Execute();//执行微信处理过程
           return Content(messageHandler.ResponseDocument.ToString());
       }

messageHandler.Execute();用于执行整个信息处理过程,其中会调用重写的OnxxRequest方法。

用户上下文

可能您已经注意到,从v0.4.0开始,MessageHandler提供了一个泛型:

public class MyMessageHandler : MessageHandler<MessageContext>

这里的MessageContext是SDK默认提供的一个基于IMessageContext接口的类(已经基本够用),您也可以根据自己的需要实现自己的类。 关于上下文的说明见这里:用户上下文WeixinContext和MessageContext。

来源:https://github.com/JeffreySu/WeiXinMPSDK/wiki/

标签:C#,微信,公众号,开发,MessageHandler,简化,消息,处理,流程
0
投稿

猜你喜欢

  • Java 静态代理与动态 代理解析

    2023-08-22 17:18:19
  • Java设计模式之模板方法模式Template Method Pattern详解

    2023-09-21 12:28:04
  • 图文详解Java中的字节输入与输出流

    2022-12-23 23:14:48
  • Java 动态代理的多种实现方式

    2023-11-20 05:23:14
  • 多线程如何解决for循环效率的问题

    2023-12-02 08:31:55
  • 花样使用Handler与源码分析

    2023-07-30 08:36:31
  • mybatis-plus中lambdaQuery()与lambdaUpdate()比较常见的使用方法总结

    2023-11-24 22:43:04
  • C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    2023-06-09 10:29:56
  • Java遗传算法之冲出迷宫

    2022-01-12 21:34:58
  • C#中实现可变参数实例

    2022-03-27 15:48:07
  • Java多线程Atomic包操作原子变量与原子类详解

    2023-08-18 07:46:25
  • java生成图片验证码示例程序

    2023-09-13 10:17:57
  • springboot 整合 sa-token简介及入门教程

    2023-03-24 01:10:45
  • Java深入探究关键字abstract的使用

    2023-08-03 07:48:20
  • Linux下执行java程序的方法

    2023-01-25 07:22:23
  • C# Partial:分部方法和分部类代码实例

    2022-04-07 11:28:26
  • JAVA验证身份证号码有效性的实例代码

    2021-08-20 13:52:06
  • C#生成随机验证码代码分享

    2023-07-17 21:22:26
  • spring cloud config 配置中心快速实现过程解析

    2022-02-19 06:50:22
  • java String类常量池分析及"equals"和"==”区别详细介绍

    2021-11-28 01:54:48
  • asp之家 软件编程 m.aspxhome.com