Nservicebus RavenDB.SagaPersister.Save中的异常;Guid应包含32位数字和4个破折号;。Raven中的Guid为空

Nservicebus RavenDB.SagaPersister.Save中的异常;Guid应包含32位数字和4个破折号;。Raven中的Guid为空,nservicebus,nservicebus-sagas,Nservicebus,Nservicebus Sagas,NServiceBus 5.1、RavenDB持久性、AutoFac容器、log4net、发布时NuGet中的所有最新版本 EndpointConfig: log4net.Config.XmlConfigurator.Configure(); LogManager.Use<Log4NetFactory>(); // Raven DataStore for Freight system var freightDa

NServiceBus 5.1、RavenDB持久性、AutoFac容器、log4net、发布时NuGet中的所有最新版本

EndpointConfig:

            log4net.Config.XmlConfigurator.Configure();
        LogManager.Use<Log4NetFactory>();

        // Raven DataStore for Freight system
        var freightDataStore = new DocumentStore { 
            ConnectionStringName = "RavenDB",
            DefaultDatabase = "ProTeria.Freight"
        };
        freightDataStore.Initialize();
        freightDataStore.Conventions.IdentityPartsSeparator = "-";
        Raven.Client.Indexes.IndexCreation.CreateIndexes(typeof(ProTeria.NET.RavenDB.BringInvoiceIndexes.BringInvoiceIndexBringIdAndStatus).Assembly, freightDataStore);

        // Raven DataStore for NServiceBus
        var nsbDataStore = new DocumentStore
        {
            ConnectionStringName = "NServiceBus.Persistence",
            DefaultDatabase = "Freight.BookingProcessing"
        };
        nsbDataStore.Initialize();

        // Set up and build AutoFac container
        var builder = new ContainerBuilder();
        builder.RegisterInstance<DocumentStore>(freightDataStore).As<IDocumentStore>().SingleInstance();
        builder.Register(c => 
        {
            var reportsService = new ReportsService();
            return reportsService;
        })
            .As<IReportsService>()
            .SingleInstance();
        builder.Register(c =>
        {
            var getCalcShippingTask = new GetCalculatedShippingReportTask(c.Resolve<IReportsService>(), c.Resolve<IBus>(), c.Resolve<IDocumentStore>());
            return getCalcShippingTask;
        });
        var container = builder.Build();

        // Set up NServiceBus
        configuration.UseContainer<AutofacBuilder>(customizations => customizations.ExistingLifetimeScope(container));
        configuration.Conventions()
            .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"))
            .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events"))
            .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.EndsWith("Messages"));
        configuration.UsePersistence<RavenDBPersistence>().SetDefaultDocumentStore(nsbDataStore);
    }
编辑 日志输出(现在使用SagaId登录到ACommand的处理程序(实际名称为OrderInvoiceCommand)

    2014-11-07 10:53:49,601 [22] DEBUG Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga [(null)] <(null)> - Handling OrderInvoiceCommand which starts saga. Saga data: Saga Id: cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f
BringInvoiceId: 702542157
OriginalMessageId: 52a7b74d-5e7c-4e7b-bc03-a3dc00b2cd72
2014-11-07 10:53:49,844 [22] DEBUG Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga [(null)] <(null)> - Invoice with id 702542157 not found in DB, as Bring to generate and request a timeout for checking generation status
<removed some BehaviorChain entries>
2014-11-07 10:53:50,530 [22] DEBUG NServiceBus.BehaviorChain`1 [(null)] <(null)> - LogOutgoingMessageBehavior
2014-11-07 10:53:50,532 [22] DEBUG LogOutgoingMessage [(null)] <(null)> - Sending message 'Freight.BookingProcessing.InvoiceReporting.InvoiceCreationTimeout, Freight.BookingProcessing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' with id '226603e6-8b1e-4dec-ae94-a3dc00b39545' to destination 'Freight.BookingProcessing@TRYGVEXISHAN'.
ToString() of the message yields: Freight.BookingProcessing.InvoiceReporting.InvoiceCreationTimeout
Message headers:
NServiceBus.SagaId:cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f, NServiceBus.IsSagaTimeoutMessage:True, NServiceBus.SagaType:Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga, Freight.BookingProcessing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, NServiceBus.OriginatingSagaId:cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f, NServiceBus.OriginatingSagaType:Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga, Freight.BookingProcessing, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
2014-11-07 10:53:50,535 [22] DEBUG NServiceBus.BehaviorChain`1 [(null)] <(null)> - DispatchMessageToTransportBehavior
2014-11-07 10:53:50,550 [22] DEBUG NServiceBus.BehaviorChain`1 [(null)] <(null)> - LicenseBehavior
2014-11-07 10:53:51,024 [22] INFO  NServiceBus.Unicast.Transport.TransportReceiver [(null)] <(null)> - Failed to process message
System.FormatException: Guid should contain 32 digits with 4 dashes (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
   at System.Guid.GuidResult.SetFailure(ParseFailureKind failure, String failureMessageID, Object failureMessageFormatArgument, String failureArgumentName, Exception innerException)
   at System.Guid.TryParseGuidWithNoStyle(String guidString, GuidResult& result)
   at System.Guid.TryParseGuid(String g, GuidStyles flags, GuidResult& result)
   at System.Guid..ctor(String g)
   at Raven.Client.Converters.GuidConverter.ConvertTo(String value)
   at Raven.Client.Document.GenerateEntityIdOnTheClient.SetPropertyOrField(Type propertyOrFieldType, Object entity, Action`1 setIdentifier, String id)
   at Raven.Client.Document.GenerateEntityIdOnTheClient.TrySetIdentity(Object entity, String id)
   at Raven.Client.Document.GenerateEntityIdOnTheClient.GenerateDocumentKeyForStorage(Object entity)
   at Raven.Client.Document.InMemoryDocumentSessionOperations.StoreInternal(Object entity, Etag etag, String id, Boolean forceConcurrencyCheck)
   at Raven.Client.Document.InMemoryDocumentSessionOperations.Store(Object entity)
   at NServiceBus.SagaPersisters.RavenDB.SagaPersister.Save(IContainSagaData saga) in c:\BuildAgent\work\9b594c1b0f1d3bab\src\NServiceBus.RavenDB\SagaPersister\SagaPersister.cs:line 22
   at NServiceBus.SagaPersistenceBehavior.Invoke(IncomingContext context, Action next) in c:\BuildAgent\work\1b05a2fea6e4cd32\src\NServiceBus.Core\Sagas\SagaPersistenceBehavior.cs:line 116
2014-11-07 10:53:49601[22]调试货运.BookingProcessing.InvoiceReporting.InvoiceReportSaga[(null)]-处理启动saga的订单invoice命令。saga数据:saga Id:cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f
BringInvoiceId:702542157
原始消息ID:52a7b74d-5e7c-4e7b-bc03-a3dc00b2cd72
2014-11-07 10:53:49844[22]调试Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga[(null)]-在数据库中找不到id为702542157的发票,导致生成并请求检查生成状态的超时
2014-11-07 10:53:50530[22]调试NServiceBus.BehaviorChain`1[(null)]-注销消息行为
2014-11-07 10:53:50532[22]调试LogOutgoingMessage[(null)]-发送消息'Freight.BookingProcessing.InvoiceReporting.InvoiceCreationTimeout,Freight.BookingProcessing,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null',id为'226603e6-8b1e-4dec-ae94-a3dc00b39545',到目的地'Freight'。BookingProcessing@TRYGVEXISHAN'.
消息的ToString()生成:货运.BookingProcessing.InvoiceReporting.InvoiceCreationTimeout
消息头:
N Service Bus.SagaId:cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f,N Service Bus.IsSagaTimeoutMessage:True,N Service Bus.SagaType:Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga,Freight.BookingProcessing,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null,N Service Bus.OriginatingsGaId:cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f,N Service Bus.OriginagingInGagType:Freight.BookingProcessing.InvoiceReporting.InvoiceReportSaga,Freight.BookingProcessing,版本=1.0.0.0,区域性=中性,PublicKeyToken=null
2014-11-07 10:53:50535[22]调试NServiceBus.BehaviorChain`1[(null)]-发送消息到TransportBehavior
2014-11-07 10:53:50550[22]调试NServiceBus.BehaviorChain`1[(null)]-许可证行为
2014-11-07 10:53:51024[22]信息NServiceBus.Unicast.Transport.TransportReceiver[(null)]-无法处理消息
System.FormatException:Guid应包含32位数字和4个破折号(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxxxxxx)。
在System.Guid.GuidResult.SetFailure(ParseFailureKind失败、字符串failureMessageID、对象failureMessageFormatArgument、字符串failureArgumentName、异常innerException)
位于System.Guid.TryParseGuidWithNoStyle(字符串guidString、GuidResult和result)
在System.Guid.TryParseGuid(字符串g、GuidStyles标志、GuidResult和result)
at System.Guid..ctor(字符串g)
位于Raven.Client.Converters.GuidConverter.ConvertTo(字符串值)
在Raven.Client.Document.generateentitydontheclient.SetPropertyOrField(类型propertyOrFieldType,对象实体,操作'1 setIdentifier,字符串id)
在Raven.Client.Document.generateentitydontheclient.TrySetIdentity(对象实体,字符串id)
在Raven.Client.Document.generateentyi中的Client.GenerateDocumentKeyForStorage(对象实体)
位于Raven.Client.Document.InMemoryDocumentSessionOperations.StoreInternal(对象实体、Etag Etag、字符串id、布尔强制并发检查)
位于Raven.Client.Document.InMemoryDocumentSessionOperations.Store(对象实体)
在c:\BuildAgent\work\9b594c1b0f1d3bab\src\NServiceBus.RavenDB\SagaPersister\SagaPersister.Save(IContainSagaData saga)中的NServiceBus.SagaPersister.RavenDB.SagaPersister.Save(IContainSagaData saga):第22行
在c:\BuildAgent\work\1b05a2fea6e4cd32\src\NServiceBus.Core\Sagas\SagaPersistenceBehavior.Invoke中的NServiceBus.SagaPersistenceBehavior.Invoke(输入上下文上下文,下一步操作):第116行

我想出来了。这是

freightDataStore.Conventions.IdentityPartsSeparator = "-";
这愚弄了Raven,因为生成的id可能看起来像InvoiceSaga-cdd0b4ed-d310-41fa-a8dd-a3dc00b3942f

编辑这可以通过向DocumentStore.Conventions.IdentityProviders注册自定义Raven.Client.Converters.ITypeConverter作为Guid来解决。有关更多信息,请参阅和

但是为什么NSB使用freightDataStore而不是nsbDataStore来保存这个传奇呢?我还不知道。我可能误解了如何配置NSB,在容器中注册了两个不同的IDataStores?有什么指导吗


编辑我为此创建了一个单独的问题:

似乎sagaId是Guid。当持久化程序试图保存它时,它是空的。你能在handle metod中记录saga id以验证是否是这样吗?sagaId在SagaData中不是空的,我已经更新了日志输出。
freightDataStore.Conventions.IdentityPartsSeparator = "-";