ui展示 网站,centos架设wordpress,wordpress怎么适配手机端,免费建域名网站背景做微信公众号开发的时候#xff0c;其中有个接收普通消息、接收事件推送 API。有这么条规则#xff0c;  ”微信服务器在五秒内收不到响应会断掉连接#xff0c;并且重新发起请求#xff0c;总共重试三次。假如服务器无法保证在五秒内处理并回复#xff0c;可以直接回… 背景 做微信公众号开发的时候其中有个接收普通消息、接收事件推送 API。有这么条规则  ”微信服务器在五秒内收不到响应会断掉连接并且重新发起请求总共重试三次。假如服务器无法保证在五秒内处理并回复可以直接回复空串微信服务器不会对此作任何处理并且不会发起重试。详情请见“发送消息-被动回复消息””。概括起来就2点1、就是说5s没响应这个请求就会被放弃2、会重新发起请求具有幂等性问题这样就会产生2个问题。1、假设我的方法就正好需要6s,那么即使返回结果也是没用的因为请求被放弃了。2、我需要返回给用户正确的回信假设第一次超时没法及时回信比如绑定操作第一次没回信第二次再来总不能回复绑定过了这样显然不合理。或者直接回复 success 这样显然没法正常的进行消息提醒。那么怎么做到既执行了操作第一次超时了第二次微信重试又及时回复正确的回信呢 。代码实现1、定义缓存的key就是消息MsgId。  string cacheKey  model.MsgId.ToString();
2、使用缓存机制把结果缓存起来下次进来直接回复上次执行的结果。  TimeSpan expired  new TimeSpan(0, 0, 20);string cacheKey  model.MsgId.ToString();return _cacheLayer.Get(cacheKey, () {MsgReply param  new MsgReply() { ToUserName  model.FromUserName, FromUserName  model.ToUserName };string Jsonstr  WeiXinHelper.ReadAccess(HttpRuntime.AppDomainAppPath.ToString()  /App_Data/WeChat/KeyWordReplay.json);var r  JsonConvert.DeserializeObjectAutoReplay(Jsonstr);param.Content  r.content;if (String.Equals(model.MsgType, text, StringComparison.CurrentCultureIgnoreCase)){var item  r.keywordcontent.FirstOrDefault(o  o.keyword.Contains(model.Content));if (item ! null){param.Content  item.content;}}string response  _weChatAlertsService.SubscribeReply(param);AddReceiveLog(model, xml, response);return response;}, expired);
3、这样既解决幂等问题也返回了正确的结果。4、这里需要注意缓存取得每个 Key专有的 lock object若同时有多个 thread要求相同资料只会(到数据库)查第一次剩下的从 cache读取。    public T GetT(string key, FuncT getDataWork, TimeSpan absoluteExpireTime, bool forceRefresh  false, bool returnCopy  true) where T : class{try{lock (GetMemoryCacheLockObject(key)){private static object GetMemoryCacheLockObject(string key){string cacheLockKey  string.Format(MemoryCacheLockObjectFormat, key);lock (CacheObject){var lockObject  CacheObject[cacheLockKey];if (lockObject  null){// 取得每個 Key專屬的 lock object若同時有多個 thread要求相同資料只會(到資料庫)查第一次剩下的從 cache讀取lockObject  new object();CacheObject.Set(cacheLockKey,lockObject,new System.Runtime.Caching.CacheItemPolicy(){AbsoluteExpiration  DateTimeOffset.UtcNow.AddMinutes(10)});}return lockObject;}}
总结1、使用缓存机制把第一次的结果保存下来对方重试的时候直接返回上次的结果。2、使用lock 保证并发的时候若同时有多个 thread要求相同资料只会(到数据库)查第一次剩下的从 cache读取。