通过推送技术很难进行事务处理。
这样做的唯一事务选项是使用 WCF 桥,它需要反过来使用 SQL Server 2008,自 2012 年以来,SQL Server 托管 CLR 阻止的基于 WSDL 的程序集的动态后台编译,我从未破解过如何强制编译这些程序集以避免引用托管 CLR 策略禁止的程序集。
我发现工作的唯一选择(可能是由于我未能找出解决方法)是使用 HttpClient RESTFull 样式的网络客户端和 CLR 集成过程,该过程脱离 SQL Server Broker 激活过程。它工作得非常好,只有一个问题,RESTFull 不支持开箱即用的事务。因此,如果您需要保证消息的传递,您将需要在消息流中的某处进行检查调用。
事实上,为了保护 MSMQ 操作的完整性,我在我的 RESTFull 和 MSMQ 之间插入了一个事务性 WCF 服务,并且在 MSMQ 上使用了触发器,它又具有策略驱动的事务性数据处理。请注意,MSMQ 触发器需要安装 MSMQ 触发器功能。我选择了基于 exe 的触发器,因为替代方法是使用基于 COM 的 DLL,我不喜欢使用 COM,因为自由线程 DLL 需要实现复杂的 C++ 应用程序和单元线程,这在 C# 中使用 CCW 设计相对容易,对应用规模施加限制。最后 RESTFull 调用可以被认为是“接近事务的”,因为它是在事务的上下文中执行的,除非你有一些严重的错误,例如错过捕获错误条件(基本上错过实现 try / catch )并抛出,当需要提高错误条件时,您将受益于可靠的提交/回滚。然而,当丢失数据被认为等于没有提交时,通过检查调用和合理的超时来加强,以确保消息传递的可靠性,这是很好的。