C#微信公眾號(hào)開(kāi)發(fā)之使用MessageHandler簡(jiǎn)化消息處理流程
微信公眾平臺(tái)對(duì)信息做了比較清晰的分類,最基本的包括請(qǐng)求(Request)和響應(yīng)(Response)兩大類信息,這兩類信息有分為文字、語(yǔ)音、圖片等格式。
這些類型在Senparc.Weixin.MP.dll SDK中以枚舉的方式區(qū)分,同時(shí)根據(jù)嚴(yán)格命名規(guī)則命名了所有類型的RequestMessage和ResponseMessage。
但是基于枚舉和類名的區(qū)分,勢(shì)必會(huì)使用到switch或者反射這樣復(fù)雜的代碼,用于處理不同類型的微信信息。
為此,從v0.3.0起,Senparc.Weixin.MP開(kāi)發(fā)了MessageHandler,對(duì)消息處理進(jìn)行了封裝(所以MessageHandler內(nèi)部仍然使用了復(fù)雜但是高效的switch等判斷手法),可以在使用SDK的時(shí)候輕松、簡(jiǎn)潔地處理各類信息,原本需要寫(xiě)入if或者switch判斷數(shù)據(jù)類型,然后執(zhí)行的代碼塊,現(xiàn)在都只需要寫(xiě)入到對(duì)應(yīng)的方法中。
MessageHandler是一個(gè)抽象類,開(kāi)發(fā)者可以在自己的項(xiàng)目中創(chuàng)建自己的類,繼承并實(shí)現(xiàn)(重寫(xiě))MessageHandler中提供的方法。
第一步,我們新建一個(gè)MyMessageHandler.cs,將MessageHandler作為基類并重寫(xiě)所有方法:
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 = "這條消息來(lái)自DefaultResponseMessage。";
return responseMessage;
}
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
//...
}
public override IResponseMessageBase OnVoiceRequest(RequestMessageVoice requestMessage)
{
//...
}
//更多沒(méi)有重寫(xiě)的OnXX方法,將默認(rèn)返回DefaultResponseMessage中的結(jié)果。
....
}
}上述代碼中重寫(xiě)的方法對(duì)應(yīng)了接收不同的Request類型(在MessageHandler.cs源文件中已有詳細(xì)說(shuō)明,根據(jù)命名規(guī)則也很好理解)。
構(gòu)造函數(shù)的inputStream用于接收來(lái)自微信服務(wù)器的請(qǐng)求流(如果需要在外部處理,這里也可以傳入XDocument)。
第二步,在不同的重寫(xiě)方法內(nèi),實(shí)現(xiàn)自己的方法。 比如我們對(duì)于文字(Text)信息進(jìn)行這樣的處理:
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ā)送【位置】【圖片】【語(yǔ)音】等類型的信息,查看不同格式的回復(fù)。\r\nSDK官方地址:http://weixin.senparc.com",
requestMessage.Content);
return responseMessage;
}ResponseMessageBase.CreateFromRequestMessage方法在主頁(yè)的readme.md中已經(jīng)有說(shuō)明,用于指定初始化特定類型的ResponseMessage。最終返回的responseMessage可以是基于IResponseMessageBase的任何類型。
第三步,在Action中使用MessageHandler(如果在Webforms里通常寫(xiě)在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ù)錯(cuò)誤!");
}
var messageHandler = new CustomerMessageHandler(Request.InputStream);
messageHandler.Execute();//執(zhí)行微信處理過(guò)程
return Content(messageHandler.ResponseDocument.ToString());
}messageHandler.Execute();用于執(zhí)行整個(gè)信息處理過(guò)程,其中會(huì)調(diào)用重寫(xiě)的OnxxRequest方法。
用戶上下文
可能您已經(jīng)注意到,從v0.4.0開(kāi)始,MessageHandler提供了一個(gè)泛型:
public class MyMessageHandler : MessageHandler<MessageContext>
這里的MessageContext是SDK默認(rèn)提供的一個(gè)基于IMessageContext接口的類(已經(jīng)基本夠用),您也可以根據(jù)自己的需要實(shí)現(xiàn)自己的類。 關(guān)于上下文的說(shuō)明見(jiàn)這里:用戶上下文WeixinContext和MessageContext。
到此這篇關(guān)于C#使用MessageHandler簡(jiǎn)化消息處理流程的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#中的文件路徑獲取函數(shù)和文件名字獲取函數(shù)小結(jié)
這篇文章主要介紹了C#中的文件路徑獲取函數(shù)和文件名字獲取函數(shù)小結(jié),本文講解了獲取絕對(duì)文件路徑、獲取文件名字、獲得包含 path 目錄信等內(nèi)容,需要的朋友可以參考下2015-01-01
c#實(shí)現(xiàn)輸出的字符靠右對(duì)齊的示例
下面小編就為大家分享一篇c#實(shí)現(xiàn)輸出的字符靠右對(duì)齊的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
C#實(shí)現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實(shí)例解析
這篇文章主要介紹了C#實(shí)現(xiàn)WebSocket協(xié)議客戶端和服務(wù)器websocket sharp組件實(shí)例解析,包括websocket sharp組件的概念及使用方法,需要的朋友可以參考下2017-04-04

