您好,登錄后才能下訂單哦!
這篇文章主要介紹“C#如何使用MessageHandler簡化消息處理”,在日常操作中,相信很多人在C#如何使用MessageHandler簡化消息處理問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#如何使用MessageHandler簡化消息處理”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
微信公眾平臺對信息做了比較清晰的分類,最基本的包括請求(Request)和響應(Response)兩大類信息,這兩類信息有分為文字、語音、圖片等格式。
這些類型在Senparc.Weixin.MP.dll SDK中以枚舉的方式區(qū)分,同時根據(jù)嚴格命名規(guī)則命名了所有類型的RequestMessage和ResponseMessage。
但是基于枚舉和類名的區(qū)分,勢必會使用到switch或者反射這樣復雜的代碼,用于處理不同類型的微信信息。
為此,從v0.3.0起,Senparc.Weixin.MP開發(fā)了MessageHandler,對消息處理進行了封裝(所以MessageHandler內(nèi)部仍然使用了復雜但是高效的switch等判斷手法),可以在使用SDK的時候輕松、簡潔地處理各類信息,原本需要寫入if或者switch判斷數(shù)據(jù)類型,然后執(zhí)行的代碼塊,現(xiàn)在都只需要寫入到對應的方法中。
MessageHandler是一個抽象類,開發(fā)者可以在自己的項目中創(chuàng)建自己的類,繼承并實現(xiàn)(重寫)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源文件中已有詳細說明,根據(jù)命名規(guī)則也很好理解)。
構造函數(shù)的inputStream用于接收來自微信服務器的請求流(如果需要在外部處理,這里也可以傳入XDocument)。
第二步,在不同的重寫方法內(nèi),實現(xiàn)自己的方法。 比如我們對于文字(Text)信息進行這樣的處理:
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage) { //TODO:這里的邏輯可以交給Service處理具體信息,參考OnLocationRequest方法或/Service/LocationSercice.cs var responseMessage = CreateResponseMessage<ResponseMessageText>(); responseMessage.Content = string.Format( "您剛才發(fā)送了文字信息:{0}\r\n您還可以發(fā)送【位置】【圖片】【語音】等類型的信息,查看不同格式的回復。\r\nSDK官方地址:http://weixin.senparc.com", requestMessage.Content); return responseMessage; }
ResponseMessageBase.CreateFromRequestMessage方法在主頁的readme.md中已經(jīng)有說明,用于指定初始化特定類型的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("參數(shù)錯誤!"); } var messageHandler = new CustomerMessageHandler(Request.InputStream); messageHandler.Execute();//執(zhí)行微信處理過程 return Content(messageHandler.ResponseDocument.ToString()); }
messageHandler.Execute();用于執(zhí)行整個信息處理過程,其中會調(diào)用重寫的OnxxRequest方法。
可能您已經(jīng)注意到,從v0.4.0開始,MessageHandler提供了一個泛型:
public class MyMessageHandler : MessageHandler<MessageContext>
這里的MessageContext是SDK默認提供的一個基于IMessageContext接口的類(已經(jīng)基本夠用),您也可以根據(jù)自己的需要實現(xiàn)自己的類。
到此,關于“C#如何使用MessageHandler簡化消息處理”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。