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

bueraiye 2016-05-27 11:19:12
最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个ashx的handler页面来接收。但是微信要求在接收到了以后需要在五秒内回复空串,否则会提示错误。我把消息的XML信息处理再写入数据库的时间是远远超过五秒了。所以我想可不可以先回复空串再进行数据处理。

我的代码是这样的,
          
if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
{
//服务器无法保证在五秒内处理并回复,直接回复空串
HttpContext.Current.Response.Output.Write("");

using (Stream stream = HttpContext.Current.Request.InputStream)
{
Byte[] postBytes = new Byte[stream.Length];
stream.Read(postBytes, 0, (Int32)stream.Length);
postString = Encoding.UTF8.GetString(postBytes);
}

//然后数据处理,写入数据库
..........

}


但是这个代码实际运行的时候还是报错,错误是500 internal server error, 应该还是我没有及时回复微信服务器空串。但是在我的代码里以及实在第一时间先回复空串,再进行数据处理了。
我也尝试用了
  HttpContext.Current.Response.End();
Output.Write("");
之后,这一次服务器回复OK了,但是数据却并没有处理,好像是因为在end()之后,这个页面就停止继续运行了。请问这种情况如果我需要先回复空串,再继续在该页面处理数据该怎么做呢?谢谢大家啦。
...全文
175 6 打赏 收藏 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2016-06-02
  • 打赏
  • 举报
回复
最喜欢接分的帖子了
bueraiye 2016-06-01
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
[quote=引用 楼主 u013413766 的回复:] 最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个ashx的handler页面来接收。但是微信要求在接收到了以后需要在五秒内回复空串,否则会提示错误。我把消息的XML信息处理再写入数据库的时间是远远超过五秒了。所以我想可不可以先回复空串再进行数据处理。
回复空串,微信就会作为异常而处理。如果你回复一个空的“文本信息”,这又会在客户端(微信终端)上显示一个空的短信息对话框。 我无法想象你普通的处理为什么会“远远超过5秒”时间。我的概念中,平均业务处理不会超过200毫秒。如果有超过2秒钟的业务,一般来说,都应该设计为异步处理的。但是此异步非彼“异步”,这个异步是指业务逻辑上的异步,例如人家把“下单”跟“发货”分离为两个任务,下单是一个订单流程中的一个动作,而发货是同一个订单流程的另一个动作,它们之间可以相隔0.1秒也可以相隔1个月,因此异步的。 而你的“远远超过5秒”就很难看出你是怎么设计软件的,只能估计是从“根上”就有设计问题。那么一个从根源上其实就搞不起来的系统、不能上线的系统,再怎么努力其实也推不出去的。就算是微信公众平台不给你设置这个“5秒钟”的门槛,也经不起市场检验。 因此还是要解决你的“远远超过5秒钟”的深层问题。这里简单回复任何技术问题,都只是皮毛。[/quote] 谢谢这么详细的解答,我后来发现是数据库设置有点问题,一直无法写入,所以才会导致处理时间超过五秒。看来还是应该先返回空串,再进行数据处理。最后选择了使用一个新线程专门返回空串。
  • 打赏
  • 举报
回复
ThreadPool Task
江南小鱼 2016-05-28
  • 打赏
  • 举报
回复
启动一个新线程处理你的xml
  • 打赏
  • 举报
回复
引用 楼主 u013413766 的回复:
最近在做微信公众号开发,在接收微信公众号消息的时候,我使用一个ashx的handler页面来接收。但是微信要求在接收到了以后需要在五秒内回复空串,否则会提示错误。我把消息的XML信息处理再写入数据库的时间是远远超过五秒了。所以我想可不可以先回复空串再进行数据处理。
回复空串,微信就会作为异常而处理。如果你回复一个空的“文本信息”,这又会在客户端(微信终端)上显示一个空的短信息对话框。 我无法想象你普通的处理为什么会“远远超过5秒”时间。我的概念中,平均业务处理不会超过200毫秒。如果有超过2秒钟的业务,一般来说,都应该设计为异步处理的。但是此异步非彼“异步”,这个异步是指业务逻辑上的异步,例如人家把“下单”跟“发货”分离为两个任务,下单是一个订单流程中的一个动作,而发货是同一个订单流程的另一个动作,它们之间可以相隔0.1秒也可以相隔1个月,因此异步的。 而你的“远远超过5秒”就很难看出你是怎么设计软件的,只能估计是从“根上”就有设计问题。那么一个从根源上其实就搞不起来的系统、不能上线的系统,再怎么努力其实也推不出去的。就算是微信公众平台不给你设置这个“5秒钟”的门槛,也经不起市场检验。 因此还是要解决你的“远远超过5秒钟”的深层问题。这里简单回复任何技术问题,都只是皮毛。
  • 打赏
  • 举报
回复
首先,如果你的数据跟 Response 无关,就可以异步操作。例如u
ThreadPool.QueueUserWorkItem(h =>
{
     .........
});
这里的过程应该与 Response 无关。 另外,我们使用 NoSql 的目的是为了每秒能够写10万以上数据、每秒读(按索引查询)几十万记录。关系数据库当大量多用户并发时其“数据库事务”的瓶颈会造成性能要降低几十倍(关系数据库的事务只能做到每秒百八十个,而不是十万个)。 你说你写一次数据要远远超过5秒钟,我觉得这应该在软件设计上下功夫了,已经严重超出我能想象的范围了。
内容概要:本文围绕分布式电源接入对配电网的影响展开研究,利用Matlab进行建模仿真与代码实现,系统分析了分布式电源(如光伏、风电等)接入后对配电网在电能质量、潮流分布、电压稳定性、保护配置等方面的影响。研究涵盖了多种分布式电源类型与不同渗透率场景,通过构建典型的配电网模型,仿真其在正常运行及故障条件下的动态响应特性,重点探讨了分布式电源引起的电压越限、反向潮流、短路电流水平变化等问题,并提出了相应的优化调控策略与解决方案。同时,结合主动配电网的有功无功协调优化、鲁棒调度等高级应用,展示了如何借助现代优化算法提升系统接纳能力与运行经济性。; 适合人群:具备电力系统基础知识,熟悉Matlab/Simulink仿真环境,从事新能源接入、配电网规划与运行等相关领域的科研人员、工程师及高校研究生。; 使用场景及目标:①掌握分布式电源接入对配电网关键指标的影响机制;②学习基于Matlab的配电网建模与仿真方法;③理解并实现主动配电网的协调优化调度算法;④为实际工程分布式电源并网方案设计与问题诊断提供理论支持和技术参考。; 阅读建议:建议读者结合文提供的Matlab代码,逐步复现仿真案例,深入理解模型构建与算法实现细节,并尝试在不同参数设置或网络结构下进行拓展实验,以增强对系统动态行为的认知与分析能力。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧