NServicebus:异常情况下的回复消息

NServicebus:异常情况下的回复消息,nservicebus,Nservicebus,我有一个端点,它接收消息并创建一个传奇,以便能够在稍后的时间点响应相应的消息。消息包含一些xml文档,此xml文档将在此消息处理程序中进行验证。如果捕获到一些验证错误,我们将创建一个消息响应(不涉及saga)来通知原始端点xml文档有问题。在验证错误的情况下,saga不会按预期和要求存储。但是我仍然想回复原始端点。问题是,nservicebus还对回复进行回滚 还有路要走吗?我试图将回复包装到新的事务范围中,但这不起作用: using (var scope = new Trans

我有一个端点,它接收消息并创建一个传奇,以便能够在稍后的时间点响应相应的消息。消息包含一些xml文档,此xml文档将在此消息处理程序中进行验证。如果捕获到一些验证错误,我们将创建一个消息响应(不涉及saga)来通知原始端点xml文档有问题。在验证错误的情况下,saga不会按预期和要求存储。但是我仍然想回复原始端点。问题是,nservicebus还对回复进行回滚

还有路要走吗?我试图将回复包装到新的事务范围中,但这不起作用:

        using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
        {
            this.bus.Reply(message);

            scope.Complete();
        }
有什么建议吗?提前谢谢

其他信息: 最初的问题是,我没有抛出(或重新抛出)任何异常,而是回复 致catch部分的发起者(我知道它的设计很糟糕)


Saga存储时在id上应用了一个惟一的属性,该id来自原始端点。由于我没有在应答案例中抛出或传递任何异常(发生验证错误),所以nservicebus总是存储该事件。如果原始端点更正xml使其有效并重新发送消息(具有相同id),nservicebus将尝试存储具有相同id的新saga(由于具有该唯一属性的saga已存在,因此在ravenDB上导致并发异常)。作为一个快速解决方案,我想更改unique属性,并使用message id作为unique属性。在这种情况下,我确信消息id总是唯一的,saga并发异常不会再次发生。您知道这是否会导致任何副作用吗?

您可以利用消息处理程序管道。管道中的第一个处理程序可以执行验证,并在必要时执行任何响应。在验证过程中,不要抛出异常,只需回复即可。第二个处理程序可以启动传奇,并将状态设置为“无效”或类似的内容。我的假设是,您将收到另一个包含有效数据的请求,然后您将按照“正常”流程,将状态设置为“有效”并继续。

为什么需要回滚?在接触任何其他资源之前,您不能预先进行所有验证吗?只需
MarkAsComplete
saga就可以了,这样它就不会被持久化了?如果出现错误,我会将saga标记为完整的。非常感谢你!尝试了这个解决方案,为我工作,并将这个传奇标记为完成,谢谢!