Senparc.Weixin SDk是目前.net平台上使用率最高的微信SDK,除硬件平台暫未發布以外覆蓋了所有微信平台模塊,自2013年免費開源起已經持續更新了4年,是GitHub上目前Star和Fork數最多的中國C#開源項目。
目前大多數模塊都支持了.net 4.0 / .net 4.5 / .net core 三個版本,Senparc官方計划在2017年將新增.net 4.6.2版本,並着力強化.net core版本,在7月左右會停止對.net 4.0版本的更新。
其中,小程序的模塊命名為Senparc.Weixin.WxOpen,Nuget地址:
https://www.nuget.org/packages/Senparc.Weixin.WxOpen
v1.0版本已於2017年1月9日凌晨同步上線!
Senparc.Wexin SDK系列庫:
過去的4年時間,Senparc團隊總共迭代發布了100多個穩定版本,目前總體框架已經比較完善,可以應對超高並發在內的各種系統環境。
以下是官方提供的一些資源:
官網:http://weixin.senparc.com/
源代碼(包含Demo):https://github.com/JeffreySu/WeiXinMPSDK
在線Demo(包含Nuget項目入口):http://sdk.weixin.senparc.com/
Demo公眾號:盛派網絡小助手
公眾號開發系列教程:http://www.cnblogs.com/szw/p/weixin-course-index.html
下載類庫chm幫助文檔:http://sdk.weixin.senparc.com/Document
在線類庫幫助文檔:http://doc.weixin.senparc.com/
微信開發資源匯總項目:https://github.com/JeffreySu/WeixinResource
Senparc.Weixin SDK交流QQ群:342319110
小程序開發交流QQ群:108830388
微信平台生態關系
加上小程序之后,整個公眾號的平台生態又多了一環,根據開發代碼體量和包含關系(尤其是核心重疊部分),目前大概是下面這樣的場景:
整個2016年,開發者們被微信小程序吊足了胃口,每每微信官方有小程序的動態發布,都會被刷屏,大眾對微信小程序的關注程度可見一斑。
對於開發者來說,無論微信小程序的實際商業應用廣度或是被接受度如何,這都將是一塊熟悉又陌生的廣闊的處女地。
由於小程序的多數規則和微信公眾號基本一致,因此我們的小程序模塊(Senparc.Weixin.WxOpen.dll)多數代碼是從公眾號模塊(Senparc.Weixin.MP.dll)移植過來的。
微信官方為小程序准備了比較細致的文檔和教程(這一點和當初公眾號相比簡直不在一個級別上),以下是一些重要的線上資源:
小程序開發文:https://mp.weixin.qq.com/debug/wxadoc/dev/
小程序設計指南:https://mp.weixin.qq.com/debug/wxadoc/design/
開發工具下載:
https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html
下文將整理目前為止對小程序后端開發最為重要的知識點、注意點進行介紹,或給出對應資源的地址,並就和微信公眾號相關的技能給出相關的索引。
對於一個在高並發場景下保持高可用性的小程序來說,這幾個方面的處理細節是不可忽視的:
消息處理
上下文
消息加密
AccessToken令牌處理
高級接口
異步開發
分布式緩存
同步鎖
WebSocket
跟蹤日志及異常處理
消息處理
微信小程序在進入客服會話狀態之后,即可與客服進行對話,可以發送文字或圖片信息,和公眾號不同的是,目前小程序的消息系統是不能進行直接回復的,必須使用異步的方式調用“客服接口”推送消息(下文會講到),為此我們優化了Senparc.Weixin SDK中的消息處理流程:MessageHandler。
MessageHandler是一個信消息的處理模塊,也是整個微信開發過程中不可缺少的一部分。在MessageHandler中,開發者可以非常輕松地處理所有類型的微信消息。小程序的MessageHandler類叫做WxOpenMessageHandler。
在ASP.NET MVC我們只需要如下幾步就可實現對消息的處理(和微信公眾號一致)。
第一步:創建上上下文類,CustomWxOpenMessageContext.cs:
有關WxOpenMessageContext(上下文)的內容下文會講到。
CustomWxOpenMessageContext.cs 代碼如下:
using Senparc.Weixin.Context;
using Senparc.Weixin.WxOpen.Entities;
namespace Senparc.Weixin.MP.Sample.CommonService.WxOpenMessageHandler
{
public class CustomWxOpenMessageContext : MessageContext<IRequestMessageBase,IResponseMessageBase>
{
public CustomWxOpenMessageContext()
{
base.MessageContextRemoved += CustomMessageContext_MessageContextRemoved;
}
/// <summary>
/// 當上下文過期,被移除時觸發的時間
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void CustomMessageContext_MessageContextRemoved(object sender, Senparc.Weixin.Context.WeixinContextRemovedEventArgs<IRequestMessageBase,IResponseMessageBase> e)
{
/* 注意,這個事件不是實時觸發的(當然你也可以專門寫一個線程監控)
* 為了提高效率,根據WeixinContext中的算法,這里的過期消息會在過期后下一條請求執行之前被清除
*/
var messageContext = e.MessageContext as CustomWxOpenMessageContext;
if (messageContext == null)
{
return;//如果是正常的調用,messageContext不會為null
}
//TODO:這里根據需要執行消息過期時候的邏輯,下面的代碼僅供參考
//Log.InfoFormat("{0}的消息上下文已過期",e.OpenId);
//api.SendMessage(e.OpenId, "由於長時間未搭理客服,您的客服狀態已退出!");
}
}
}
源碼:
第二步:創建自定義 CustomWxOpenMessageHandler.cs:
CustomWxOpenMessageHandler.cs 代碼如下:
using System.IO;
using System.Web.Configuration;
using Senparc.Weixin.MP.Entities;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MessageHandlers;
using IRequestMessageBase = Senparc.Weixin.MP.Entities.IRequestMessageBase;
using IResponseMessageBase = Senparc.Weixin.MP.Entities.IResponseMessageBase;
namespace Senparc.Weixin.MP.Sample.CommonService.WxOpenMessageHandler
{
/// <summary>
/// 自定義MessageHandler
/// 把MessageHandler作為基類,重寫對應請求的處理方法
/// </summary>
public partial class CustomWxOpenMessageHandler : MessageHandler<CustomWxOpenMessageContext>
{
private string appId = WebConfigurationManager.AppSettings["WxOpenAppId"];
private string appSecret = WebConfigurationManager.AppSettings["WxOpenAppSecret"];
public CustomWxOpenMessageHandler(Stream inputStream, PostModel postModel, int maxRecordCount = 0)
: base(inputStream, postModel, maxRecordCount)
{
//這里設置僅用於測試,實際開發可以在外部更全局的地方設置,
//比如MessageHandler<MessageContext>.GlobalWeixinContext.ExpireMinutes = 3。
WeixinContext.ExpireMinutes = 3;
if (!string.IsNullOrEmpty(postModel.AppId))
{
appId = postModel.AppId;//通過第三方開放平台發送過來的請求
}
//在指定條件下,不使用消息去重
base.OmitRepeatedMessageFunc = requestMessage =>
{
var textRequestMessage = requestMessage as RequestMessageText;
if (textRequestMessage != null && textRequestMessage.Content == "容錯")
{
return false;
}
return true;
};
}
public override void OnExecuting()
{
//測試MessageContext.StorageData
if (CurrentMessageContext.StorageData == null)
{
CurrentMessageContext.StorageData = 0;
}
base.OnExecuting();
}
public override void OnExecuted()
{
base.OnExecuted();
CurrentMessageContext.StorageData = ((int)CurrentMessageContext.StorageData) + 1;
}
/// <summary>
/// 處理文字請求
/// </summary>
/// <returns></returns>
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
//TODO:這里的邏輯可以交給Service處理具體信息,參考OnLocationRequest方法或/Service/LocationSercice.cs
//這里可以進行數據庫記錄或處理
return new SuccessResponseMessage();
}
public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage)
{
//發來圖片,進行處理
return DefaultResponseMessage(requestMessage);
}
public override IResponseMessageBase DefaultResponseMessage(IRequestMessageBase requestMessage)
{
//所有沒有被處理的消息會默認返回這里的結果
return new SuccessResponseMessage();
//return new SuccessResponseMessage();等效於:
//base.TextResponseMessage = "success";
//return null;
}
}
}
源碼:
微信小程序的MessageHandler和微信公眾號的MessageHandler的一些區別見下表,這也是微信小程序和微信公眾號在消息處理上的一些差別,務必須要注意!
微信公眾號
微信小程序
請求消息類型
眾多
1、 文本消息
2、 圖片消息
請求事件類型
眾多
進入會話(客服)事件
返回類型
1、基於
Senparc.Weixin.MP.
ResponseMessageBase
的子類
2、返回空字符串或"success"
(也可以使用SuccessResponseMessage)
只返回空字符串或"success"
(也可以使用SuccessResponseMessage)
注意:微信小程序的文本及圖片類型請求消息,是在“客服對話”的狀態下轉發到開發者服務器的。
第三步:創建Conntroller,為使用MessageHandler做准備:
using System;
using System.IO;
using System.Web.Configuration;
using System.Web.Mvc;
using Senparc.Weixin.MP.Entities.Request;
using Senparc.Weixin.MP.MvcExtension;
using Senparc.Weixin.MP.Sample.CommonService. WxOpenMessageHandler;
namespace Senparc.Weixin.MP.Sample.Controllers.WxOpen
{
/// <summary>
/// 微信小程序Controller
/// </summary>
public partial class WxOpenController : Controller
{
public static readonly string Token = WebConfigurationManager.AppSettings["WxOpenToken"];//與微信公眾賬號后台的Token設置保持一致,區分大小寫。
public static readonly string EncodingAESKey = WebConfigurationManager.AppSettings["WxOpenEncodingAESKey"];//與微信公眾賬號后台的EncodingAESKey設置保持一致,區分大小寫。
public static readonly string AppId = WebConfigurationManager.AppSettings["WxOpenAppId"];//與微信公眾賬號后台的AppId設置保持一致,區分大小寫。
}
}
源碼:
第四步:添加Action,使用MessageHandler
微信小程序的Url驗證邏輯和微信公眾號是一致的,為此我們需要添加2個Action來分別處理驗證(GET)的請求和微信轉發的消息請求(POST)。
GET請求:
/// <summary>
/// GET請求用於處理微信小程序后台的URL驗證
/// </summary>
/// <returns></returns>
[HttpGet]
[ActionName("Index")]
public ActionResult Get(PostModel postModel, string echostr)
{
if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content(echostr); //返回隨機字符串則表示驗證通過
}
else
{
return Content("failed:" + postModel.Signature + "," + MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" +
"如果你在瀏覽器中看到這句話,說明此地址可以被作為微信小程序后台的Url,請注意保持Token一致。");
}
}
GET請求部署完畢之后,我們直接使用瀏覽器打開,可以看到一條提示,表明此Action已經可以被訪問:
POST請求:
/// <summary>
/// 用戶發送消息后,微信平台自動Post一個請求到這里,並等待響應XML。
/// </summary>
[HttpPost]
[ActionName("Index")]
public ActionResult Post(PostModel postModel)
{
if (!CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
return Content("參數錯誤!");
}
postModel.Token = Token;//根據自己后台的設置保持一致
postModel.EncodingAESKey = EncodingAESKey;//根據自己后台的設置保持一致
postModel.AppId = AppId;//根據自己后台的設置保持一致
var maxRecordCount = 50;
//第一步:MessageHandler,對微信請求的詳細判斷操作都在這里面。
var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount);
//第二步:執行微信處理過程
messageHandler.Execute();
//第三步:返回結果
return new FixWeixinBugWeixinResult(messageHandler);
}
核心的“三部曲”和微信公眾號保持了完全的一致。
現在,只需要在Web.config中配置正確的AppId等信息,就可以在小程序后台完成“消息推送”接口的配置:
隨后,我們就能在微信小程序的預覽狀態或正式發布之后,測試消息處理能力,下文中的“高級接口”部分我們會豐富消息處理過程,並進行發布。
上下文
在CustomWxOpenMessageHandler的基類設置的時候,我們看到使用了一個叫MessageContext的泛型(MessageHandler<MessageContext>),這個MessageContext是Senparc.Weixin SDK提供的一個默認的消息上下文處理類。
MessageContext主要用於消息由微信服務器統一轉發的情況下,無法針對單個用戶對話使用Session的情況,同時也具有消息去重等方法。這個默認的類已經能夠處理最基礎的情況,如果您的應用不是很復雜,那么直接用這個類就行了。如果項目比較復雜,您也可以根據自己的需要創建一個自己的類(實現IMessageContext接口),或繼承這個類之后,再擴展更多的屬性(例如工作流和比較特殊的分布式緩存,等等)。
上下文除了彌補Session的作用存儲個人數據以外,還提供了完整對話記錄的保存,對於機器人回復等場景都具有非常重要的作用。
Senparc.Weixin SDk已經對上下文功能進行了比較充分的解耦,使之成為一個獨立的模塊,可以進行自由的重寫和擴展。開發者可以自由設置上下文保存的時間及條數。
微信服務器在沒有迅速收到應用程序服務器回應的情況下,在5秒有效等待時間內,內會連續發送共計3條相同的消息,這會給程序帶來一些困擾,因此,消息去重在MessageHandler里面是一個非常重要的“標配”。
消息去重已經在Senparc.Weixin.MP.MessageHandlers.MessageHandler.cs的OnExecuting()方法中實現,默認為開啟,如果在某些特殊需求下需要關閉,可以將OmitRepeatedMessage參數設置為false。
由於去重方法是在OnExecuting()方法中優先執行,因此OmitRepeatedMessage的設置必須早於OnExecuting(),可以在MessageHandler的構造函數中,也可以在MessageHandler實例化之后進行設置,例如:
var messageHandler = new CustomMessageHandler(Request.InputStream, postModel);//接收消息(第一步)
messageHandler. OmitRepeatedMessage = false;
messageHandler.Execute();//執行微信處理過程
消息加密
出於消息安全考慮,微信提供了消息加密的方法,並且推薦使用。微信公眾號的后台會要求開發者填寫EncodingAESKey,或自動生成,如下圖:
消息加密的狀態在MessageHandler內部已經進行了自動判斷及相關解碼、編碼的處理,因此開發者無因為消息加密的類型編寫任何代碼,只需要在微信后台按需設置即可。
在數據格式方面,微信小程序比微信公眾號多提供了一個可選的JSON數據格式, Senparc.Weixin.WxOpen.dll將在v1.2版本提供對JSON格式的支持,目前請使用和微信公眾號相同的XML格式。
AccessToken令牌處理
AccessToken是用於提供高級接口請求身份驗證的令牌,由AppId及Secret通過API獲得。AppId及Secret可以在微信小程序后台的【設置】>【開發設置】中找到或生成。
微信小程序的AccessToken令牌規則及使用方式與公眾號完全兼容,因此我們在小程序模塊中,共享了公眾號的AccessToken處理模塊:AccessTokenContainer。
AccessTokenContainer的作用是自動處理AccessToken的過期、儲存(包括分布式緩存)等問題,讓開發者可以專注到邏輯開發中,從而徹底忽略由於AccessToken延伸出來的一堆麻煩事。
AccessTokenContainer的使用要求開發者在Global或App_Start中對AppId及Secret進行注冊(當然也可以在需要用到AccessToken之前的任意程序位置進行),例如:
protected void Application_Start()
{
/* 微信配置開始
*
* 建議按照以下順序進行注冊,尤其須將緩存放在第一位!
*/
RegisterWeixinCache(); //注冊分布式緩存(按需,如果需要,必須放在第一個)
RegisterWeixinThreads(); //激活微信緩存及隊列線程(必須)
RegisterSenparcWeixin(); //注冊Demo所用微信公眾號的賬號信息(按需)
RegisterSenparcQyWeixin(); //注冊Demo所用微信企業號的賬號信息(按需)
RegisterWeixinPay(); //注冊微信支付(按需)
RegisterWeixinThirdParty(); //注冊微信第三方平台(按需)
ConfigWeixinTraceLog(); //配置微信跟蹤日志(按需)
/* 微信配置結束 */
}
/// <summary>
/// 注冊Demo所用微信公眾號的賬號信息
/// </summary>
private void RegisterSenparcWeixin()
{
//注冊公眾號
AccessTokenContainer.Register(
System.Configuration.ConfigurationManager.AppSettings["WeixinAppId"],
System.Configuration.ConfigurationManager.AppSettings["WeixinAppSecret"],
"【盛派網絡小助手】公眾號");
//注冊小程序(完美兼容)
AccessTokenContainer.Register(
System.Configuration.ConfigurationManager.AppSettings["WxOpenAppId"],
System.Configuration.ConfigurationManager.AppSettings["WxOpenAppSecret"],
"【盛派互動】小程序");
}
上述紅色的代碼是和注冊AccessTokenContainer有關的,實際上只需要添加3行代碼,即可完全忘掉AccessToken這回事。
高級接口
小程序目前提供了包括二維碼、Code換取、模板消息等少量的高級接口,並且兼容了微信公眾號的文本及圖片類型的客服接口(48小時內主動推送)。
Senparc.Weixin SDK為高級接口提供了非常高效、便捷的處理方式,用戶如果已經注冊了AppId及Secret,那么在調用高級接口的時候無需再提供AccessToken,只需提供AppId即可,AccessTokenContainer會自動識別傳入的字符串屬於AppId或是Secret,並對令牌過期等問題進行自動處理,確保在最大的可能性下面,開發者可以一次性得到期望的響應結果。
例如上文介紹的消息處理過程中,我們可以使用高級接口來即時回復用戶:
/// <summary>
/// 處理文字請求
/// </summary>
/// <returns></returns>
public override IResponseMessageBase OnTextRequest(RequestMessageText requestMessage)
{
//TODO:這里的邏輯可以交給Service處理具體信息,參考OnLocationRequest方法或/Service/LocationSercice.cs
//這里可以進行數據庫記錄或處理
//發送一條客服消息回復用戶
var result = new StringBuilder();
result.AppendFormat("您剛才發送了文字信息:{0}\r\n\r\n", requestMessage.Content);
if (CurrentMessageContext.RequestMessages.Count > 1)
{
result.AppendFormat("您剛才還發送了如下消息({0}/{1}):\r\n", CurrentMessageContext.RequestMessages.Count,
CurrentMessageContext.StorageData);
for (int i = CurrentMessageContext.RequestMessages.Count - 2; i >= 0; i--)
{
var historyMessage = CurrentMessageContext.RequestMessages[i];
string content = null;
if (historyMessage is RequestMessageText)
{
content = (historyMessage as RequestMessageText).Content;
}
else if (historyMessage is RequestMessageEvent_UserEnterTempSession)
{
content = "[進入客服]";
}
else
{
content = string.Format("[非文字信息:{0}]", historyMessage.GetType().Name);
}
result.AppendFormat("{0} 【{1}】{2}\r\n",
historyMessage.CreateTime.ToShortTimeString(),
historyMessage.MsgType.ToString(),
content
);
}
result.AppendLine("\r\n");
}
//處理微信換行符識別問題
var msg = result.ToString().Replace("\r\n", "\n");
//使用微信公眾號的接口,完美兼容
Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, msg);
return new SuccessResponseMessage();
//和公眾號一樣回復XML是無效的:
// return new SuccessResponseMessage()
// {
// ReturnText = string.Format(@"<?xml version=""1.0"" encoding=""utf-8""?>
//<xml>
// <ToUserName><![CDATA[{0}]]></ToUserName>
// <FromUserName><![CDATA[{1}]]></FromUserName>
// <CreateTime>1357986928</CreateTime>
// <MsgType><![CDATA[text]]></MsgType>
// <Content><![CDATA[TNT2]]></Content>
//</xml>",requestMessage.FromUserName,requestMessage.ToUserName)
// };
}
其中高級接口調用代碼只需要一行:
Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, msg);
進入客服的狀態也用同樣的方式處理:
public override IResponseMessageBase OnEvent_UserEnterTempSessionRequest(RequestMessageEvent_UserEnterTempSession requestMessage)
{
//進入客服
var msg = "歡迎您!這條消息來自Senparc.Weixin進入客服事件。";
Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, msg);
return DefaultResponseMessage(requestMessage);
}
我們再來改寫圖片處理方式(注意,這次我們會使用異步模式):
public override IResponseMessageBase OnImageRequest(RequestMessageImage requestMessage)
{
//發來圖片,進行處理
Task.Factory.StartNew(async () =>
{
await Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendTextAsync(appId, WeixinOpenId, "剛才您發送了這張圖片:");
await Senparc.Weixin.MP.AdvancedAPIs.CustomApi.SendImageAsync(appId, WeixinOpenId, requestMessage.MediaId);
});
return DefaultResponseMessage(requestMessage);
}
上述代碼中,使用了和微信公眾號兼容的圖片高級接口。
在微信小程序的預覽或發布狀態下,用戶可以收到如下回復:
進入客服狀態及發送文字及回復
發送圖片及回復
異步開發
在高並發的場景下,異步編程可以說是入門級的一個必備。
在Senparc.Weixin SDK中,我們總共提供了400多個異步方法,除可能的個別遺漏以外,已經覆蓋了所有的高級接口,方法命名規則為同步方法名后加Async。我們的目標是覆蓋所有並發場景下會成為瓶頸的接口,其中MessageHandler的異步版本也已經計划在Senparc.Weixin.dll v4.11中上線。
異步方法的使用在.NET 4.5之后已經變得非常簡單,例如下面的是文字消息的同步方法調用:
AdvancedAPIs.CustomApi.SendText(appId, WeixinOpenId, "這是一條文字信息");
使用異步方法:
Task.Factory.StartNew(async () =>
{
await AdvancedAPIs.CustomApi.SendTextAsync(appId, WeixinOpenId, "這是一條文字信息");
});
分布式緩存
在需要考慮緩存生命周期、並發量等諸多因素的情況下,我們通常都會采用負載均衡來環節服務器壓力,這種情況下幾乎都會用到分布式緩存。
尤其對於微信的公眾號的AccessToken,同一時間內真正有效的AccessToken只有一個(當然也存在一段時間的有效緩存,企業號是沒有這個問題的),如果多台服務器各自管理自己內存中的AccessToken數據,必然會導致一場不會停止的“令牌爭奪戰”:各自判斷AccessToken失效之后,刷新私有的AccessToken,直到當天的AccessToken獲取次數被用完,系統無法提供高級接口服務。
這種情況下就需要一個統一的“數據中心”來儲存AccessToken等獨一份的信息,實現的方法有很多:分布式緩存、數據庫、文件、數據交換模塊等等,通常我們會首選分布式緩存。
Senparc.Weixin SDK為分布式緩存做了比較細致的架構,可以適應許多復雜情況下微信對於緩存的需求,並且提供了Memcached(Senparc.Weixin.Cache.Memcached.dll)和Redis(Senparc.Weixin.Cache.Redis.dll)兩種緩存的實現。相比之下我們更推薦Redis,也在Redis模塊上花了更多的精力進行優化。
Senparc.Weixin SDK已經實現了緩存策略的熱切換,開發者可以在任意時候切換緩存狀態(本地緩存、Reids、Memcached或自己擴展的任何緩存策略),並且不會影響到AccessTokenContainner等模塊的穩定性。
Senparc.Weixin SDK默認緩存采用單機的本地內存,緩存生命周期和應用程序緊密聯系,如果要突破這樣的限制,或是在分布式環境中使用,就需要引入外部的緩存,以Redis緩存為例,我們只需要3行代碼即可完成切換:
//定義Redis連接字符串
var redisConfiguration = System.Configuration.ConfigurationManager.AppSettings["Cache_Redis_Configuration"];
//設置Redis連接字符串
RedisManager.ConfigurationOption = redisConfiguration;
//指定緩存策略實例
CacheStrategyFactory.RegisterObjectCacheStrategy(() => RedisObjectCacheStrategy.Instance);
只要配置正確,接下來的存取、序列化、儲存格式、key管理等問題開發者都不必關心,無論使用什么緩存從策略,邏輯代碼都無需做任何修改,Senparc.Weixin SDK的緩存策略接口已經對行為進行了嚴格規范,實現類會針對不同的緩存進行差別化的處理。
同步鎖、WebSocket、跟蹤日志及異常處理
請期待下一篇。
本文的Demo已經發布到GitHub的開源項目中,位於:https://github.com/JeffreySu/WeiXinMPSDK/tree/master/src/Senparc.Weixin.MP.Sample
以上部分內容節選自正在編寫的《微信公眾平台快速開發(擬)》圖書,編寫工作已經進入尾聲,預計於年后進入出版流程,歡迎參與眾籌:
.NET社區新聞,深度好文,微信中搜索dotNET跨平台或掃描二維碼關注
————————————————
版權聲明:本文為CSDN博主「dotNET跨平台」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sD7O95O/article/details/78096919