ASP.NET中的异步响应

时间:2013-04-04 13:59:37

标签: c# asp.net multithreading asynchronous concurrency

我目前正在开展电子商务项目,我的付款页面需要一些帮助。在结账页面,我收到用户的付款信息,这只是一个GSM号码,我将其发布到支付系统服务,该服务返回同步响应。响应可以是“OK”,“NOT OK”,“AWAIT”和“TIMEOUT”。 OK表示付款成功,NOT OK表示付款不成功,当然“TIMEOUT”表示付款操作超时。

棘手的部分是“AWAIT”。此服务的超时时间为4分钟。这4分钟用于用户通过他/她的手机完成他/她的付款。支付系统以不同的方式工作,当我开始支付过程时,服务立即返回“AWAIT”并向用户的智能手机发送通知。此通知开始,我们称之为自定义钱包,自定义钱包应用程序。然后,用户选择他/她的支付卡,该支付卡在该自定义钱包系统中预先定义并确认支付。用户有4分钟的超时时间。在这4分钟内,他/她完成付款或操作超时。 我的问题是,这种支付服务是同步操作。所以,我必须每隔5秒钟调用一次,持续4分钟,直到我收到“AWAIT”以外的响应。此时,我必须向页面返回同步响应,指示付款流程已开始并等待用户确认并启动异步操作,该操作将检查此自定义钱包服务4分钟并获得响应。然后我需要将此异步响应发布到网页上。

我正在寻找的是一种解决此问题的方法,以避免可能的问题,如并发或同步。我也很感激为此提供一些示例代码。 感谢...

1 个答案:

答案 0 :(得分:3)

  

此时我必须向页面返回同步响应,指示付款流程已开始并等待用户确认并启动异步操作,该操作将检查此自定义钱包服务4分钟并获得响应。然后我需要将此异步响应发布到网页上。

是的,这并不容易。我可以推荐的唯一解决方案非常复杂。

当初始请求进入时,您需要为该事务创建持久实体,保存它,然后返回唯一实体标识符。请注意,它必须保存在持久位置(即Azure表)中。

接下来,您需要一个单独的服务器来轮询更新(即Azure工作者角色或Win32服务)。这不应该从ASP.NET完成,因为它是没有HTTP请求的工作。

然后,当您的最终用户应用程序轮询完成时,您的Web服务可以从持久实体中检索当前状态。

您可以采用不同的“快捷方式”:将实体保留在内存中而不是持久性,并将服务器滚动到ASP.NET站点中的某种后台进程中。但这两种捷径都会带来严重的可靠性和稳健性问题,并且 不应考虑进行金融交易。