我可以在自己的TransactionScope中注册NServiceBus Publish吗?

时间:2017-06-23 20:21:59

标签: wcf nservicebus transactionscope

我在IIS中将WCF服务作为http端点托管。在处理对这些服务的命令请求的某些时刻,我想在NServiceBus上发布一个事件来指示处理了什么命令。我是否可以在我在代码中创建和管理的TransactionScope中执行此操作(以便我可以在同一事务中包含我的数据库交互)?我希望能够从该范围内的总线发布,以便在范围完成时实际发布。当我运行以下内容时:

  using (var scope = new TransactionScope()) {
    bus.Publish(new SomethingHappened { Description = String.Format("{0} logged in at {1}", user.Name, DateTime.Now.ToLongTimeString()) }).ConfigureAwait(false).GetAwaiter().GetResult();
  }

我发现订阅者收到了该消息,即使我没有在事务范围上调用scope.Complete()。如果有的话,我可以更改什么,以便发布在作用域中注册?

1 个答案:

答案 0 :(得分:1)

事实证明,为了让事务范围管理异步调用,您需要使用特殊选项TransactionScopeAsyncFlowOption.Enabled打开它,如下所示:

using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) {
  bus.Publish(new SomethingHappened { Description = String.Format("{0} logged in at {1}", user.Name, DateTime.Now.ToLongTimeString()) }).ConfigureAwait(false).GetAwaiter().GetResult();
}

这样做,你得到了我期待的行为。