我有一个ashx的hanler,请问handler中如何先回复再完成数据处理?

问题描述

最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个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秒钟”的深层问题。这里简单回复任何技术问题,都只是皮毛。

谢谢这么详细的解答,我后来发现是数据库设置有点问题,一直无法写入,所以才会导致处理时间超过五秒。看来还是应该先返回空串,再进行数据处理。最后选择了使用一个新线程专门返回空串。
解决方案七:
最喜欢接分的帖子了

时间: 2024-08-27 04:07:03

我有一个ashx的hanler,请问handler中如何先回复再完成数据处理?的相关文章

前端-用php和mysql为我们实验室建立一个小网站,请问有没有合适的模板源码?

问题描述 用php和mysql为我们实验室建立一个小网站,请问有没有合适的模板源码? 自己在chinaz上下载了几个,但是不尽人意,希望有路过的朋友能够提供帮助,只有建立一个链接数据库的小网站,不用线上上运行,所以模板不用太复杂,前端有了就好,谢谢 解决方案 你应该说明网站用途,根据用途可以决定里的要用什么,只链接数据库使用phpadmin就好 解决方案二: 这样谁说你更想要的是前端的页面

百度-请问php中去读取一个php文件然后显示在前台,怎么做啊?

问题描述 请问php中去读取一个php文件然后显示在前台,怎么做啊? 如题,百度说用include.但是没有demo我不知道如何写,谁有demo或者例子能分享一下吗? 解决方案 file get content函数试试 解决方案二: file get content函数试试

java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗。

问题描述 java spring注入bean生成一个类实例,请问这个类实例是单体类吗?全局唯一吗. 小弟刚从C++转JAVA不久,遇到这样一个问题,求高人帮忙解答. 我现在大体理解了注入的实现方式,例如在一个标注有@configuration 的类里面,如果一个方法 上面有@bean,那么这个方法的返回的类对象会被实例化. 我的疑问是这样的,这个实例化的对象是全局唯一的吗,或者说 是一个单体类吗? 因为我要在我的程序里不同地方使用调用这个bean的方法,我担心如果是单体类的话, 是否存在数据同步

请问MVVM中,new一个与用户控件数据绑定的ViewModel对象后,其属性值为空了,这是为什么?

问题描述 请问MVVM中,new一个与用户控件数据绑定的ViewMode类l对象后,其属性值为空了,这是为什么? 解决方案 本帖最后由 zjp1907 于 2014-08-28 01:50:33 编辑解决方案二: 解决方案三:new一个ViewModel是新创建一个对象,当然是空的啦,除非你这个ViewModel是从别的地方传过来的,里面的值才可能不为空.又或者就是你这个ViewModel中的字段属性都有默认值--解决方案四:引用 回复于:2014-08-2823:13:51new一个ViewM

视图的加载过程有点慢,我想加入一个进度条,请问该如何操作?

问题描述 DataGridView1.DataSource=myDataview这个加载过程有点慢,我想加入一个进度条,请问该如何操作? 解决方案 解决方案二:怎么没人回答呢?难道我的问题问得不好?解决方案三:DataGridView1.DataSource=myDataview加入一个进度条,可能需要记录总量,而且每获取一个记录需要刷新一次,不建议这样做:建议加入一个loadingGIF:具体多线程,MSDN里面好多.解决方案四:请问这个多线程该如何使用啊?解决方案五:OptionExplic

link环境下制作一款《订餐软件》,请问软件中建立了不止一个帐台,如何用代码操作帐台的切换?

问题描述 link环境下制作一款<订餐软件>,请问软件中建立了不止一个帐台,如何用代码操作帐台的切换? link环境下制作一款<订餐软件>,请问软件中建立了不止一个帐台,如何用代码操作帐台的切换? 解决方案 最简单的办法是放在不同的表,这样切换不同的表就切换了不同的账户了.

自己想写一个轻量级的框架 请问大神thinkphp中的common模块是怎样实现的

问题描述 自己想写一个轻量级的框架 请问大神thinkphp中的common模块是怎样实现的 就是我现在有很多的函数 怎样能像放在thinkphp中的common中的function和config中自动调用 求实现方法和原理 最好有代码 在此谢谢了

请问C#中从1000多万个文本文件中查询一个数据,用什么算法会比较高效?用数据库么

问题描述 请问C#中从1000多万个文本文件中查询一个数据,用什么算法会比较高效?用数据库么 请问C#中从1000多万个文本文件中查询一个数据,用什么算法会比较高效?用数据库么 解决方案 肯定是要先做预处理,如果是文本数据,那么就需要先分词,然后建立倒排索引(全文索引) 解决方案二: ...关键这1000多万个文本文件怎么生成的,没有索引,怎么查找都没效率,关键是文件读写占用了时间. 解决方案三: 用lucence等建立全文索引来进行查找.

格式-请问oracle中如何得到一个日期是周几

问题描述 请问oracle中如何得到一个日期是周几 select to_number(sysdate,'day') from dual; 是会报错的 不要to_char的 解决方案 select to_number(to_char(sysdate - 1,'d')) from dual; 解决方案二: select trunc(sysdate) - trunc(sysdate,'day') from dual