【问题标题】:Asynchronous Response in ASP.NETASP.NET 中的异步响应
【发布时间】:2013-04-04 13:59:36
【问题描述】:

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

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

我正在寻找一种解决此问题的方法,以避免可能出现的问题,如并发或同步。我也希望有一些示例代码。 谢谢...

【问题讨论】:

  • What I'm looking for is a way to solve this problem 你已经很好地描述了你的任务。但不知何故,我没能准确地看到问题出在哪里。你介意为有短期记忆的人解释一下吗?
  • 您遇到的问题不仅仅是并发问题 - 在处理付款时可靠性也非常重要。与其尝试将您自己的 99% 的时间都有效的解决方案组合在一起,我会研究更强大的东西,例如 WCF,这样您就永远不会忘记可能需要 4 分钟才能完成的支付交易。跨度>
  • 由于其他原因,我无法使用 WCF。我只是将 httpwebrequest 发布到 url。
  • @dopache - 不要沉迷于特定的框架。关键是 - 您正在做什么以确保 1) 不会丢失任何付款请求,以及 2) 不会多次处理付款请求?

标签: c# asp.net multithreading asynchronous concurrency


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 嗯,正如你所说,这看起来很可怕。我真的不知道该尝试什么?如果你是我,你会喜欢什么。应用这种复杂的方式,还是只是在后台处理并发送信息邮件?顺便感谢您的帮助...
  • 我会使用 Azure 表进行持久存储,使用 Azure 辅助角色进行处理。是通过投票还是通过电子邮件更新用户,实际上取决于您希望应用的行为方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
相关资源
最近更新 更多