微信公众平台对信息做了比较清晰的分类,最基本的包括请求(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。
到此这篇关于C#使用MessageHandler简化消息处理流程的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持自由互联。