private WXReceiveMessage _RetrieveMessage(string openId) { WXReceiveMessage result = null; int maxWait = 10; WXReceiveMessage m; ConcurrentQueue <WXReceiveMessage> messages; if (!Global.theMessagesFromWeiXin.TryGetValue(openId, out messages)) { messages = new ConcurrentQueue <WXReceiveMessage>(); Global.theMessagesFromWeiXin.TryAdd(openId, messages); } bool dequeued = messages.TryDequeue(out m); //模拟等待 int waitime = maxWait; while (!dequeued && waitime > 0) { dequeued = messages.TryDequeue(out m); System.Threading.Thread.Sleep(200); waitime--; } if (m != null) { result = m; } return(result); }
public Stream ReceiveWXMessage(Stream s) { string result = ""; using (StreamReader sr = new StreamReader(s)) { result = sr.ReadToEnd(); } //result = OperationContext.Current.RequestContext.RequestMessage.ToString(); if (result != "") { WXReceiveMessage receiveMessage = XmlSerializeAdapter.Deserialize <WXReceiveMessage>(result); /* * XmlSerializer serializer = new XmlSerializer(typeof(WXReceiveMessage)); * using (StringReader rdr = new StringReader(result)) * { * WXReceiveMessage requestMessage = serializer.Deserialize(rdr) as WXReceiveMessage; * * } */ if (receiveMessage.MsgType.Equals("text")) { WXReceiveTextMessage requestTextMessage = XmlSerializeAdapter.Deserialize <WXReceiveTextMessage>(result); result = GlobalManager.TheWeiXinResponser.ResponseText(requestTextMessage); if (string.IsNullOrEmpty(result)) { result = GlobalManager.TheWeiXinDispatcher.DesideDispatchWho(requestTextMessage); GlobalManager.TheWeiXinDispatcher.DispatchText(requestTextMessage); } } else if (receiveMessage.MsgType.Equals("event")) { WXReceiveEventMessage requestEventMessage = XmlSerializeAdapter.Deserialize <WXReceiveEventMessage>(result); if (requestEventMessage.Event.Equals("subscribe")) { #region 关注 NormalAccount normalAccount = BuilderFactory.DefaultBulder(GlobalManager.getConnectString()).List <NormalAccount>(new NormalAccount { OpenId = requestEventMessage.FromUserName, AccountCode = GlobalManager.TheServiceAccount.AccountCode }).FirstOrDefault(); if (normalAccount == null) { //第一次关注 BuilderFactory.DefaultBulder(GlobalManager.getConnectString()).Create <NormalAccount>(new NormalAccount { AccountCode = GlobalManager.TheServiceAccount.AccountCode, OpenId = requestEventMessage.FromUserName, Gender = "F", SubscribeTime = DateTime.Now }); result = GlobalManager.TheWeiXinResponser.FormatOutputText(requestEventMessage.FromUserName, requestEventMessage.ToUserName, "欢迎加入" + GlobalManager.TheServiceAccount.Name); } else { //曾经关注过 BuilderFactory.DefaultBulder(GlobalManager.getConnectString()).Update <NormalAccount>(new NormalAccount { FollowStatus = 1, SubscribeTime = DateTime.Now, Id = normalAccount.Id }); result = GlobalManager.TheWeiXinResponser.FormatOutputText(normalAccount.OpenId, requestEventMessage.ToUserName, "欢迎重新加入" + GlobalManager.TheServiceAccount.Name); } _RefreshWXUserInfo(requestEventMessage.FromUserName, (ret) => { string gender = "N"; int iGender = int.Parse(ret.sex.ToString()); if (iGender == 1) { gender = "M"; } else if (iGender == 2) { gender = "F"; } BuilderFactory.DefaultBulder(GlobalManager.getConnectString()).ExecuteNativeSqlNoneQuery(new IBatisNetBatchStatement { StatementName = "NormalAccount_UpdateByOpenId", ParameterObject = new NormalAccount { OpenId = ret.openid, NickName = ret.nickname, Gender = gender, Language = ret.language, Country = ret.country, Province = ret.province, City = ret.city, HeadImgUrl = ret.headimgurl }.ToStringObjectDictionary(false), Type = SqlExecuteType.UPDATE }); }, null); #endregion } else if (requestEventMessage.Event.Equals("unsubscribe")) { #region 取消关注 NormalAccount normalAccount = BuilderFactory.DefaultBulder(GlobalManager.getConnectString()).List <NormalAccount>(new NormalAccount { OpenId = requestEventMessage.FromUserName, AccountCode = GlobalManager.TheServiceAccount.AccountCode }).FirstOrDefault(); if (normalAccount != null) { BuilderFactory.DefaultBulder(GlobalManager.getConnectString()).Update <NormalAccount>(new NormalAccount { FollowStatus = 0, SubscribeTime = DateTime.Now, Id = normalAccount.Id }); } #endregion } else if (requestEventMessage.Event.Equals("LOCATION")) { WXReceiveLocationMessage requestLocationMessage = XmlSerializeAdapter.Deserialize <WXReceiveLocationMessage>(result); var spParam = new { SourceTable = new NormalAccount().GetMappingTableName(), SourceId = requestLocationMessage.FromUserName, LocateType = "WX-Location-Report", Longitude = requestLocationMessage.Longitude, Latitude = requestLocationMessage.Latitude }.ToSPParam(); try { BuilderFactory.DefaultBulder().ExecuteSPNoneQuery("SP_Pub_InsertPubLocation", spParam); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } else { result = GlobalManager.TheWeiXinResponser.ResponseEvent(requestEventMessage); } } else if (receiveMessage.MsgType.Equals("location")) { } else if (receiveMessage.MsgType == "image") { } else if (receiveMessage.MsgType == "voice") { } } else { result = "hello"; } byte[] resultBytes = Encoding.UTF8.GetBytes(result); WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain"; return(new MemoryStream(resultBytes)); }