2010-02-13 73 views
0

的问题是如下: 外部服务器发送转换为HTTP请求到我有时非常耗时.aspx页接收到的SMS消息。如果没有响应,在20秒内返回到外部服务器,这被认为是一个超时和相同的消息再次发到我的aspx页面(也许再次....)ASP.NET,异步调用到另一页,返回响应立即

对我来说,最佳的解决办法是aspx页面读取传入消息(作为对aspx页面的HTTP请求),在另一个线程中开始处理消息,并立即将响应呈现回外部服务器。外部服务器对HTTP状态以外的其他内容没有兴趣(通常为200)。消息处理完成后,会导致进入应用程序的日志文件。

对消息的处理是通过向aspx页面发出另一个web请求来完成的,并且我试图对web请求使用BeginGetResponse方法,并创建了一个用于处理已完成的web请求的处理程序页。问题在于处理程序似乎不被调用,很可能是因为aspx页面的生命周期在异步web请求完成之前结束。

有没有人对这个问题有什么好的解决办法吗?我也查看了异步页面模型,但这似乎也不是我的解决方案,因为在完成消息处理之前,响应应该返回给外部服务器。

的问候,的Eivind

回答

1

我会非常小心以这种方式使用的线程在ASP.Net的。利用它们来利用多核心是一回事。使用它们来设置某种并发响应技术似乎是一种灾难。特别是当有更优雅的解决方案时。

你的ASP.Net应用程序应该只把消息并在数据库中折腾它,并发送成功应答。这是工作完成。传递消息的工作应该由某种服务或守护进程来处理。 Windows服务对于构建和维护来说是一种痛苦,所以也许只是每隔30秒左右运行一次的计划任务,检查数据库中排队的消息是否适合您的目的就好了。

我见过很多人尝试使用线程在ASP.Net,当他们真的应该只创建一个后台服务。结果从来没有像你希望的那样可靠。

+0

感谢您的回答。我希望可以在aspx页面中实现一个解决方案,但是将传入的消息转储到数据库中并使用服务来轮询新消息看起来像一个可靠的解决方案 – 2010-02-13 16:48:44

0

异步页面模型是绝对解决不了问题。你有没有尝试使用卸载事件做EndRequest?我真的不知道这是否会奏效,但值得一试。最可靠的方法是使用Windows服务来运行异步请求。

+0

嗨,谢谢你的回答。我不太确定,如果我理解您的建议,是否意味着我应该在_Unload事件处理程序中调用EndRequest方法?我真正想要实现的是响应结束,并在处理开始后立即将HTTP 200 OK发送回请求服务器 – 2010-02-13 16:48:27

+0

是的,这是我的建议。响应将在Render方法被调用后结束,因此在响应结束后执行Page_Unload。 – Stilgar 2010-02-14 00:22:37