我在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()
。如果有的话,我可以更改什么,以便发布在作用域中注册?
答案 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();
}
这样做,你得到了我期待的行为。