WCF - 两种方法之间的通信

时间:2012-07-31 07:06:03

标签: c# .net wcf c#-4.0

我有一个WCF客户端,它使用两种方法请求订单确认和WCF服务:

1)UpdateOrder - 更新数据库中的订单数据(UpdateOrder调用来自外部服务)
2)GetConfirmationResult - 保存结果返回,直到订单状态从挂起更改为其他内容。

问题是,如何在WCF中从UpdateOrder向GetConfirmationResult发出通知,订单状态已更改?

更新:如果我可以将InstanceContextMode保留为Per-Call,那将是最好的。

更新2:假设可能的订单状态为待处理,已确认,已拒绝。 ConfirmOrder可能会将订单状态更改为已确认或已拒绝,GetConfirmationResult在确认订单更改之前不应返回结果。

更新3:我已经用序列更改了图像以显示整个堆栈。

enter image description here

2 个答案:

答案 0 :(得分:3)

您说您有一个支持此服务器的数据库。然后它就像这样简单,半假的:

public YourService : YourServiceInterface
{
    public void UpdateOrder(Order order)
    {
        using (context = new DatabaseContext())
        {
            context.Orders.Where(o => o.ID == order.ID).First().IsConfirmed = order.IsConfirmed;
            context.SaveChanges();
        }
    }

    public Boolean? GetConfirmationResult(Order order)
    {
        using (context = new DatabaseContext())
        {
            return context.Orders.Where(o => o.ID == order.ID).First().IsConfirmed;
        }
    }   
}

你必须坚持下去,因为你提到的是每个呼叫实例模式。您无法让static List<Order>包含待处理的订单,只需将其保留到您的数据库中,然后将其添加为待处理状态,而不是已批准。

答案 1 :(得分:1)

听起来您的问题是基于以下事实:订单状态在特定时间发生变化,并且仅当该阶段发生变化时,服务消费者才知道新订单状态。

这是使用消息传递的完美方案。

该服务应该只是在订单状态发生变化时向客户端发送消息,而不是您的wcf客户端调用该服务。然后,客户端可以处理该消息(在您的情况下是ConfirmationResult消息)。

您可以使用netMsmqBinding并在接受msmq消息的客户端上托管操作来执行此操作。

[OperationContract]
void ReceiveConfirmationResult(ConfirmationResult result);

这更简单,因为它完全消除了您的问题的根源。作为额外的好处,可以删除服务操作GetConfirmationResult(),因为它不再需要。

更新

我认为您误解了,因为根据您的最新问题更新,这是使用排队的更强大的案例。

活动顺序:

  1. 收到订单确认
  2. 服务器状态更改
  3. 如果应将状态更改发送到客户端,服务器应用逻辑来计算
  4. 服务器向客户端发送描述状态更改的消息
相关问题