<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
微信公眾平臺對資訊做了比較清晰的分類,最基本的包括請求(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}rn您還可以傳送【位置】【圖片】【語音】等型別的資訊,檢視不同格式的回覆。rnSDK官方地址: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簡化訊息處理流程的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45