问题描述
最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个ashx的handler页面来接收。但是微信要求在接收到了以后需要在五秒内回复空串,否则会提示错误。我把消息的XML信息处理再写入数据库的时间是远远超过五秒了。所以我想可不可以先回复空串再进行数据处理。我的代码是这样的,if(HttpContext.Current.Request.HttpMethod.ToUpper()=="POST"){//服务器无法保证在五秒内处理并回复,直接回复空串HttpContext.Current.Response.Output.Write("");using(Streamstream=HttpContext.Current.Request.InputStream){Byte[]postBytes=newByte[stream.Length];stream.Read(postBytes,0,(Int32)stream.Length);postString=Encoding.UTF8.GetString(postBytes);}//然后数据处理,写入数据库..........}
但是这个代码实际运行的时候还是报错,错误是500internalservererror,应该还是我没有及时回复微信服务器空串。但是在我的代码里以及实在第一时间先回复空串,再进行数据处理了。我也尝试用了HttpContext.Current.Response.End();
在Output.Write("");
之后,这一次服务器回复OK了,但是数据却并没有处理,好像是因为在end()之后,这个页面就停止继续运行了。请问这种情况如果我需要先回复空串,再继续在该页面处理数据该怎么做呢?谢谢大家啦。
解决方案
解决方案二:
首先,如果你的数据跟Response无关,就可以异步操作。例如uThreadPool.QueueUserWorkItem(h=>{.........});
这里的过程应该与Response无关。另外,我们使用NoSql的目的是为了每秒能够写10万以上数据、每秒读(按索引查询)几十万记录。关系数据库当大量多用户并发时其“数据库事务”的瓶颈会造成性能要降低几十倍(关系数据库的事务只能做到每秒百八十个,而不是十万个)。你说你写一次数据要远远超过5秒钟,我觉得这应该在软件设计上下功夫了,已经严重超出我能想象的范围了。
解决方案三:
引用楼主u013413766的回复:
最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个ashx的handler页面来接收。但是微信要求在接收到了以后需要在五秒内回复空串,否则会提示错误。我把消息的XML信息处理再写入数据库的时间是远远超过五秒了。所以我想可不可以先回复空串再进行数据处理。
回复空串,微信就会作为异常而处理。如果你回复一个空的“文本信息”,这又会在客户端(微信终端)上显示一个空的短信息对话框。我无法想象你普通的处理为什么会“远远超过5秒”时间。我的概念中,平均业务处理不会超过200毫秒。如果有超过2秒钟的业务,一般来说,都应该设计为异步处理的。但是此异步非彼“异步”,这个异步是指业务逻辑上的异步,例如人家把“下单”跟“发货”分离为两个任务,下单是一个订单流程中的一个动作,而发货是同一个订单流程的另一个动作,它们之间可以相隔0.1秒也可以相隔1个月,因此异步的。而你的“远远超过5秒”就很难看出你是怎么设计软件的,只能估计是从“根上”就有设计问题。那么一个从根源上其实就搞不起来的系统、不能上线的系统,再怎么努力其实也推不出去的。就算是微信公众平台不给你设置这个“5秒钟”的门槛,也经不起市场检验。因此还是要解决你的“远远超过5秒钟”的深层问题。这里简单回复任何技术问题,都只是皮毛。
解决方案四:
启动一个新线程处理你的xml
解决方案五:
ThreadPoolTask
解决方案六:
引用2楼sp1234的回复:
Quote: 引用楼主u013413766的回复:
最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个ashx的handler页面来接收。但是微信要求在接收到了以后需要在五秒内回复空串,否则会提示错误。我把消息的XML信息处理再写入数据库的时间是远远超过五秒了。所以我想可不可以先回复空串再进行数据处理。回复空串,微信就会作为异常而处理。如果你回复一个空的“文本信息”,这又会在客户端(微信终端)上显示一个空的短信息对话框。我无法想象你普通的处理为什么会“远远超过5秒”时间。我的概念中,平均业务处理不会超过200毫秒。如果有超过2秒钟的业务,一般来说,都应该设计为异步处理的。但是此异步非彼“异步”,这个异步是指业务逻辑上的异步,例如人家把“下单”跟“发货”分离为两个任务,下单是一个订单流程中的一个动作,而发货是同一个订单流程的另一个动作,它们之间可以相隔0.1秒也可以相隔1个月,因此异步的。而你的“远远超过5秒”就很难看出你是怎么设计软件的,只能估计是从“根上”就有设计问题。那么一个从根源上其实就搞不起来的系统、不能上线的系统,再怎么努力其实也推不出去的。就算是微信公众平台不给你设置这个“5秒钟”的门槛,也经不起市场检验。因此还是要解决你的“远远超过5秒钟”的深层问题。这里简单回复任何技术问题,都只是皮毛。
谢谢这么详细的解答,我后来发现是数据库设置有点问题,一直无法写入,所以才会导致处理时间超过五秒。看来还是应该先返回空串,再进行数据处理。最后选择了使用一个新线程专门返回空串。
解决方案七:
最喜欢接分的帖子了