我有一个WCF客户端,它使用两种方法请求订单确认和WCF服务:
1)UpdateOrder - 更新数据库中的订单数据(UpdateOrder调用来自外部服务)
2)GetConfirmationResult - 保存结果返回,直到订单状态从挂起更改为其他内容。
问题是,如何在WCF中从UpdateOrder向GetConfirmationResult发出通知,订单状态已更改?
更新:如果我可以将InstanceContextMode保留为Per-Call,那将是最好的。
更新2:假设可能的订单状态为待处理,已确认,已拒绝。 ConfirmOrder可能会将订单状态更改为已确认或已拒绝,GetConfirmationResult在确认订单更改之前不应返回结果。
更新3:我已经用序列更改了图像以显示整个堆栈。
答案 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(),因为它不再需要。
更新
我认为您误解了,因为根据您的最新问题更新,这是使用排队的更强大的案例。
活动顺序: