C#web服务在返回响应后执行某些操作

时间:2016-06-25 22:14:17

标签: c# asp.net web-services callback

我有一个名为 S

的网络服务

我的客户有一个名为 C

的网络服务
  • 我的客户向我的网络服务发送请求(网络服务S
  • 网络服务S 会向客户发送回复( C
  • 之后,我的服务( S )将创建1张发票消息并将其发送到客户端网络服务( C
  • 客户端网络服务将结果返回到我的网络服务( S

如何实施?

enter image description here

2 个答案:

答案 0 :(得分:1)

据我了解,您希望返回对客户端应用的响应,但仍会继续进行一些处理。 这里有一些可能性:

  1. 在2.中开始一个新的thread,它将创建发票并将其发送给客户端WS。然而,这可能容易出错 - 您的Web服务可能会在创建发票的过程中死亡或被关闭,而客户端WS永远不会知道。
  2. 使用hangfire之类的内容来安排发票创建。 Hangfire将计划任务存储在DB中,因此即使出现故障也会最终执行。除了设置后端数据库之外,这不需要其他配置。处理在您的服务的同一主机进程中进行。
  3. 使用ServiceBusMSMQ - 这个想法与Hangfire相似 - 您向公交车发送消息(说"创建带参数X&#34的发票;)总线确保将消息传递给任何收听消息的人。然后,您注册一个侦听器,该侦听器将处理该类消息并创建发票。这需要更多的工作,因为你必须choose the Service Bus engine,花一点时间来理解它,安装,配置等。

答案 1 :(得分:0)

这是域事件的好例子。我不知道第一个请求是什么 - 也许下订单? 下订单时,您将发出一个表示已下订单的事件。该事件可以包含有关订单的一些信息或可用于检索它的引用(id)。然后其他听众会做出相应的回应。

一个好处是它可以使应用程序的不同部分分离。例如,提交订单的类不需要知道它将成为发票。它只是引发一个事件,表明已下订单然后继续下去。

如果您希望在下订单时拥有多种行为,那就变得更加重要。也许您还想发送一封确认收到订单的电子邮件。现在,您可以将该附加行为添加为事件侦听器,而无需修改放置订单的代码。

此外,您的应用程序可能会增长,以便可能还有其他服务来下订单。 (我和&#34一起运行;下订单"虽然我不知道具体事件是什么。)你不希望你的应用程序中的多个点跟随所有帖子 - 订购步骤。如果这些步骤发生变化,那么您必须修改所有这些地方的代码。相反,你只是举起活动。

Here's a popular article很好地描述了这个概念。有许多事件总线的实现。 Here's one

在伪代码中,您现在可以拥有一些事件处理程序,每个事件处理程序都与您的订购代码完全分离。

提交订单后立即引发事件本身。

var order = SubmitOrder(info); 
eventBus.Raise(new OrderSubmitEvent(order));

然后你有一些注册的事件处理程序来响应那个事件。

public class SendInvoiceOrderEventHandler : IEventHandler<OrderSubmitEVent>
{
    public void HandleEvent(OrderSubmitEvent e)
    {
        //e contains details about the order. Send an invoice request
    }
}

public class SendConfirmationOrderEventHandler : IEventHandler<OrderSubmitEVent>
{
    public void HandleEvent(OrderSubmitEvent e)
    {
        //send an email confirmation
    }
}
相关问题