【问题标题】:ASP.NET, asynchronous call to another page, return response immediatelyASP.NET,异步调用另一个页面,立即返回响应
【发布时间】:2010-02-13 15:27:07
【问题描述】:

问题如下: 外部服务器将转换为 HTTP 请求的传入 SMS 消息发送到我有时非常耗时的 .aspx 页面。如果在 20 秒内没有向外部服务器返回响应,这将被视为超时,并且相同的消息会再次发送到我的 aspx 页面(可能还会再次发送......)

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

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

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

问候,艾文德

【问题讨论】:

    标签: asp.net asynchronous httpwebrequest


    【解决方案1】:

    我会非常警惕以这种方式在 ASP.Net 中使用线程。使用它们来利用多个内核是一回事。使用它们来建立某种并发响应技术似乎是灾难的根源。尤其是当有更优雅的解决方案时。

    您的 ASP.Net 应用程序应该只接收消息并将其放入数据库并发送成功回复。它的工作完成了。传递消息的工作应该由某种服务或守护进程来处理。 Windows 服务的构建和维护有点麻烦,所以也许只是一个每 30 秒左右运行一次的计划任务检查数据库中的排队消息就可以满足您的目的。

    我看到很多人尝试在 ASP.Net 中使用线程,而实际上他们应该只是创建一个后台服务。结果永远不会像您希望的那样可靠。

    【讨论】:

    • 感谢您的回答。我希望有一个可以在 aspx 页面本身中实现的解决方案,但是将传入的消息转储到数据库中并使用服务来轮询新消息似乎是一个强大的解决方案
    【解决方案2】:

    异步页面模型绝对不是解决方案。您是否尝试过使用 unload 事件来执行 EndRequest?我真的不知道这是否可行,但值得一试。最稳健的方式是使用 Windows Service 来运行异步请求。

    【讨论】:

    • 您好,感谢您的回答。我不太确定我是否理解您的建议,您的意思是我应该在 _Unload 事件处理程序中调用 EndRequest 方法吗?我真正想要实现的是响应结束,并在处理开始后立即将 HTTP 200 OK 发送回请求服务器
    • 是的,这就是我的建议。响应将在调用 Render 方法后结束,因此在响应结束后执行 Page_Unload。
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多