static void HandleClient(Server server, TcpClient client) { byte[] bytes = new byte[256]; string data; while (true) { NetworkStream stream = client.GetStream(); int i; while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { data = System.Text.Encoding.UTF8.GetString(bytes, 0, i); // Verschlüsselung: data entschlüsseln GenericMessage genericMessage = JsonSerializer.Deserialize <GenericMessage>(data); IMessage message = MessageFactory.GetMessage(genericMessage.MessageId, data); IMessageHandler handler = MessageHandlerFactory.GetMessageHandler(genericMessage.MessageId); handler.Execute(server, client, message); } } }
static void ReceiveData() { while (true) { byte[] data = new byte[256]; int bytes = client.GetStream().Read(data, 0, data.Length); string responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); GenericMessage genericMessage = JsonSerializer.Deserialize <GenericMessage>(responseData); IMessage message = MessageFactory.GetMessage(genericMessage.MessageId, responseData); IMessageHandler messageHandler = MessageHandlerFactory.GetMessageHandler(genericMessage.MessageId); messageHandler.Execute(client, message); } }
public void Run(object state) { while (true) { IMessageHandler handler = null; try { MessageToken job = GetItem(); if (job != null) { if (mHandlers.TryGetValue(job.Message.GetType(), out handler)) { handler.Execute(job); } else { "{0} message handler not found".Log4Error(job.Message.GetType()); } } else { System.Threading.Thread.Sleep(10); } } catch (Exception e_) { if (handler != null) { "{0} invoke error {1}".Log4Error(e_, handler.GetType(), e_.Message); } else { "Dispatcher error {0}".Log4Error(e_, e_.Message); } } } }
static void ReceiveData() { while (client != null) { try { lock (client) { byte[] data = new byte[1024]; int bytes = client.GetStream().Read(data, 0, data.Length); string responseData = System.Text.Encoding.UTF8.GetString(data, 0, bytes); GenericMessage genericMessage = JsonSerializer.Deserialize <GenericMessage>(responseData); IMessage message = MessageFactory.GetMessage(genericMessage.MessageId, responseData); IMessageHandler messageHandler = MessageHandlerFactory.GetMessageHandler(genericMessage.MessageId); messageHandler.Execute(client, message); } } catch (System.IO.IOException) { } catch (System.ObjectDisposedException) { } } }
protected void Page_Load(object sender, EventArgs e) { string signature = Request["signature"]; string timestamp = Request["timestamp"]; string nonce = Request["nonce"]; string echostr = Request["echostr"]; string inputXml = string.Empty; using (StreamReader sr = new StreamReader(Request.InputStream)) { inputXml = sr.ReadToEnd(); inputXml = HttpUtility.UrlDecode(inputXml); } string updateMenu = Request["updatemenu"]; if (!string.IsNullOrWhiteSpace(updateMenu)) { foreach (var menu in Activator.WeChatMenuContainer.WeChatMenus) { try { if (!AccessTokenContainer.CheckRegistered(menu.AppId)) { AccessTokenContainer.Register(menu.AppId, menu.Secret); } AccessTokenResult tokenRes = null; try { tokenRes = AccessTokenContainer.GetTokenResult(menu.AppId); //CommonAPIs.CommonApi.GetToken(appId, appSecret); WriteContent(string.Format("获取到 token 为:{0}, 有效时间为 {1} 秒。", tokenRes.access_token, tokenRes.expires_in)); //var menuRes = CommonApi.GetMenu(tokenRes.access_token); } catch { WriteContent(string.Format("获取到 token 失败, appid: {0},secret: {1}。", menu.AppId, menu.Secret)); } try { if (tokenRes != null) { //重新整理按钮信息 ButtonGroup bg = new ButtonGroup(); foreach (var menuButton in menu.MenuButtons) { BaseButton but = null; switch (menuButton.Type) { case ButtonType.Click: but = new SingleClickButton() { name = menuButton.Name, key = menuButton.Key, type = "click" }; break; case ButtonType.View: but = new SingleViewButton() { name = menuButton.Name, url = menuButton.Url, type = "view" }; break; case ButtonType.SubButton: List <SingleButton> subButtons = new List <SingleButton>(); foreach (var subBut in menuButton.MenuSubButtons) { SingleButton singleBut = null; switch (subBut.Type) { case ButtonType.Click: singleBut = new SingleClickButton() { name = subBut.Name, key = subBut.Key, type = "click" }; break; case ButtonType.View: singleBut = new SingleViewButton() { name = subBut.Name, url = subBut.Url, type = "view" }; break; } if (singleBut != null) { subButtons.Add(singleBut); } } but = new SubButton() { name = menuButton.Name, sub_button = subButtons }; break; } if (but != null) { bg.button.Add(but); } } var result = CommonApi.CreateMenu(tokenRes.access_token, bg); WriteContent(string.Format("创建结果信息:{0}, 返回值 {1} ({2})。", result.errmsg, (int)result.errcode, result.errcode.ToString())); } } catch { WriteContent("创建菜单失败!"); } } catch (Exception) { //TODO:为简化代码,这里不处理异常(如Token过期) WriteContent("执行过程发生错误!"); } } } foreach (var proxy in Activator.WeChatProxyContainer.WeChatProxies) { string token = proxy.Token; if (Request.HttpMethod == "GET") { //get method - 仅在微信后台填写URL验证时触发 if (CheckSignature.Check(signature, timestamp, nonce, token)) { WriteContent(echostr); //返回随机字符串则表示验证通过 //如果有多个相同的Token,则第一个验证通过就返回 break; } else { //WriteContent("failed:" + signature + "," + CheckSignature.GetSignature(timestamp, nonce, token) + "。" + // "如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。"); //如果失败应该不返回任何东西,以便循环校验下一个Token continue; } } else { //post method - 当有用户想公众账号发送消息时触发 if (!CheckSignature.Check(signature, timestamp, nonce, token)) { WriteContent("参数错误!"); continue; } //v4.2.2之后的版本,可以设置每个人上下文消息储存的最大数量,防止内存占用过多,如果该参数小于等于0,则不限制 var maxRecordCount = 10; //自定义MessageHandler,对微信请求的详细判断操作都在这里面。 //var messageHandler = new CustomMessageHandler(Request.InputStream, maxRecordCount); IMessageHandler messageHandler = null; using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(inputXml))) { Type type = proxy.Bundle.LoadClass(proxy.Handler); var parameters = new object[] { stream, token, proxy.AppID, proxy.Secret, maxRecordCount }; messageHandler = System.Activator.CreateInstance(type, parameters) as IMessageHandler; } try { if (messageHandler != null) { //测试时可开启此记录,帮助跟踪数据,使用前请确保App_Data文件夹存在,且有读写权限。 messageHandler.RequestDocument.Save( Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + messageHandler.RequestMessage.FromUserName + ".txt")); //执行微信处理过程 messageHandler.Execute(); //测试时可开启,帮助跟踪数据 messageHandler.ResponseDocument.Save( Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + messageHandler.ResponseMessage.ToUserName + ".txt")); WriteContent(messageHandler.ResponseDocument.ToString()); continue; } } catch (Exception ex) { using (TextWriter tw = new StreamWriter(Server.MapPath("~/App_Data/Error_" + DateTime.Now.Ticks + ".txt"))) { tw.WriteLine(ex.Message); tw.WriteLine(ex.InnerException.Message); if (messageHandler.ResponseDocument != null) { tw.WriteLine(messageHandler.ResponseDocument.ToString()); } tw.Flush(); tw.Close(); } WriteContent(""); } } } Response.End(); }
public ActionResult PostPost(string key, PostModel postModel) { //根据加密的Key获取QyApp信息 var qyApp = _encryptionService.CheckDecodedQyAppKey(key, SiteConfig.WEIXIN_QY_KEY_KEY); if (qyApp == null) { return(null); } postModel.Token = qyApp.Token; postModel.EncodingAESKey = qyApp.EncodingAESKey; postModel.CorpId = qyApp.CorpId; var appKind = (AppKind)qyApp.Id; var dir = Senparc.Core.Utility.Server.GetMapPath("~/App_Data/QyAppLog/{0}/{1}".With(appKind.ToString(), DateTime.Now.ToString("yyyy-MM-dd"))); if (!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } try { IMessageHandler <IRequestMessageBase, IResponseMessageBase> messageHandler = AppMessageHandlerFactory.GetMessageHandler(appKind, Request.InputStream, postModel, qyApp); var doc = messageHandler.RequestDocument; doc.Save(Path.Combine(dir, "{0}_Request_{1}.txt".With(DateTime.Now.Ticks, messageHandler.RequestMessage.FromUserName))); //测试时可开启,帮助跟踪数据 messageHandler.Execute(); //执行微信操作 var responseDoc = messageHandler.ResponseDocument; responseDoc.Save(Path.Combine(dir, "{0}_Response_{1}.txt".With(DateTime.Now.Ticks, messageHandler.ResponseMessage.ToUserName))); //测试时可开启,帮助跟踪数据 //return Content(responseDoc.ToString()); return(new FixWeixinBugWeixinResult(messageHandler)); //return new WeixinResult(messageHandler); } catch (Exception ex) { //LogUtility.WeixinLogger.Error(ex.Message, ex); TextWriter tw = new StreamWriter(Path.Combine(dir, "Error_{0}.txt".With(DateTime.Now.Ticks + "_" + ex.Message))); tw.WriteLine(ex.Message); tw.WriteLine(ex.StackTrace); if (ex.InnerException != null) { tw.WriteLine(ex.InnerException.Message); } tw.Flush(); tw.Close(); return(Content("")); } }
private void ConsumeHandler(object ch, BasicDeliverEventArgs ea) { _channel.BasicAck(ea.DeliveryTag, false); _messageHandler.Execute(ea, _publisher); }