C#微信公眾號開發之使用MessageHandler簡化消息處理流程

微信公眾平臺對信息做瞭比較清晰的分類,最基本的包括請求(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簡化消息處理流程的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: