首页 文章

跨域的NServiceBus和MSDTC?

提问于
浏览
0

所以我正在尝试使用NServiceBus,一切顺利,直到我的应用程序尝试通过EF6将数据写入数据库,我始终得到此异常:

2016-11-18 13:35:28.340 INFO NServiceBus.RecoverabilityExecutor立即重试将重试消息'28392aef-de00-4162-8cca-a6c200c0e68e',因为异常:System.Data.Entity.Core.EntityException:底层提供商在Open上失败 . ---> System.Transactions.TransactionManagerCommunicationException:与底层事务管理器的通信失败 . ---> System.Runtime.InteropServices.COMException:由于通信问题,MSDTC事务管理器无法从源事务管理器中提取事务 . 可能的原因是:存在防火墙且MSDTC进程没有例外,两台计算机无法通过其NetBIOS名称找到对方,或者两个事务管理器之一未启用对网络事务的支持 . (来自HRESULT:0x8004D02B的例外)System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction(UInt32 propgationTokenSize,Byte [] propgationToken,IntPtr managedIdentifier,Guid&transactionIdentifier,OletxTransactionIsolationLevel&isolationLevel,ITransactionShim&transactionShim)在System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte []) propagationToken)---内部异常堆栈跟踪的结束---在System.Transactions.Transaction.Transaction上的System.Transactions.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction . (3)System.Transactions.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction.Transaction . 在System.Data的System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)的System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction transaction,Byte [] whereAbouts)中的rop.GetExportCookie(事务事务,字节[]所在位置) . System.Data.ProviderBase上System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject,DbConnectionInternal obj,Transaction事务)的System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)中的SqlClient.SqlInternalConnection.Enlist(Transaction tx) . System.Data.ProviderBase.DbConnectionPool.WaitForPendingOpen()的DbConnectionPool.TryGetConnection(DbConnection owningObject,UInt32 waitForMultipleObjectsTimeout,Boolean allowCreate,Boolean onlyOneCheckConnection,DbConnectionOptions userOptions,DbConnectionInternal&connection) - 从抛出异常的上一个位置开始的堆栈跟踪结束 - - 在System.Runtime.CompilerServices.TaskAwaiter.Thro System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的wForNonSuccess(任务任务) . <> c__DisplayClass4 . <b__3> d__6.MoveNext()---堆栈跟踪结束抛出异常的上一个位置---在System.Runtime.Compilder上运行System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.d__91中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) . MoveNext()---从抛出异常的先前位置开始的堆栈跟踪结束---在系统的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处,系统中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) .Data.Entity.Core.EntityClient.EntityConnection . <OpenAsync> d__8.MoveNext()---内部异常堆栈跟踪结束---在System.Data.Entity.Core.EntityClient.EntityConnection . <OpenAsync > d__8.MoveNext()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处)在System.Data.Entity.Core.Objects.ObjectContext . <EnsureConnectionAsync> d__9.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess( System.Data.Entity.Core.Objects.ObjectContext上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) . <ExecuteInTransactionAsync> d__3d1.MoveNext()---来自先前位置的堆栈跟踪结束被抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)at atSystem.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.d__91.MoveNext()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处System.Data.Entity.Utilities.TaskExtensions.CultureAwaiter1.GetResult()at System.Data.Entity.Core.Objects.ObjectQuery1 .CompanServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) . <GetResultsAsync> d__e.MoveNext()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Data.Entity.Utilities的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处System.Data.Entity.Inter.LazyAsyncEnumerator1中的.TaskExtensions.CultureAwaiter1.GetResult() . <FirstMoveNextAsync> d__0.MoveNext()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.Compiler中System.Data.Entity.Infrastructure.IDbAsyncEnumerableExtensions中System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的Services.TaskAwaiter.ThrowForNonSuccess(任务任务) . <ForEachAsync> d__51.MoveNext()---堆栈跟踪结束抛出异常的上一个位置---在System.Runtime.CompilerServices.Throw上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),System.Runtime.CompilerServices.TaskAwaiter1.GetResult()处的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) DAS.Services.Notifications.Data.Repository.AccountConfigurationRepository . <GetConfigurationAsync> d__2.MoveNext()在C:\ source \ DigitalAirStrike \ DAS_Platform \ das.services.notifications \ src \ DAS.Services.Notifications.Data \ Repository \ AccountConfigurationRepository中 . cs:第38行---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Run的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)中System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult()中的time.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)位于C:\ source \ DigitalAirStrike中的DAS.Services.Notifications.Service.Sms.SmsService.d__8.MoveNext() \ DAS_Platform \ das.services.notifications \ src \ DAS.Services.Notifications.Service \ Sms \ SmsService.cs:第92行---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上位于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult()处于DAS.Services.Notifications.Service.Sms.SmsService的.TaskAwaiter.ThrowForNonSuccess(任务任务) . SendTextMessageAsync> d__7.MoveNext()在C:\ source \ DigitalAirStrike \ DAS_Platform \ das.services.notifications \ src \ DAS.Services.Notifications.Service \ Sms \ SmsService.cs:第76行---来自之前的堆栈跟踪结束地点抛出异常的地方---在DAS的System.Runtime.CompilerServices.TaskAwaiter.GetResult()的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . Services.Notifications.Command.MessageDelivery.SmsDeliveryStrategy . <Deliver> d _3.MoveNext()在C:\ source \ DigitalAirStrike \ DAS_Platform \ das.services.notifications \ src \ DAS.Services.Notifications.Command \ MessageDelivery \ SmsDeliveryStrategy.cs:第19行---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处,System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) . D :.Services.Notifications.Command.Handlers.SendSmsNotificationHandler中的Runtime.CompilerServices.TaskAwaiter.GetResult() . C:\ source \ DigitalAirStrike \ DAS_Platform \ das.services.notifications \中的<Handle> d _3.MoveNext() src \ DAS.Services.Notifications.Command \ Handlers \ SendSmsNotificationHandler.cs:第32行---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)at at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()在NServiceBus.LoadHandlersConnector . <Invoke> d__1.MoveNext()在C:\ Build \ src \ NServiceBus中 . Core \ Pipeline \ Incoming \ LoadHandlersConnector.cs:第40行---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) . 位于NServiceBus.MutateIncomingMessageBehavior的System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()中的TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) . <Invoke> d__0.MoveNext()inC:\ Build \ src \ NServiceBus.Core \ Pipeline \ MutateInstanceMessage \ MutateIncomingMessageBehavior.cs:第28行---从抛出异常的上一个位置开始的堆栈跟踪---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()at NServiceBus.DeserializeLogicalMessagesConnector . <Invoke> d _1.1.MoveNext()in C:\ Build \ src \ NServiceBus.Core \ Pipeline \ Incoming \ DeserializeLogicalMessagesConnector.cs:第31行---从抛出异常的上一个位置开始的堆栈跟踪---在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)位于NServiceBus.SubscriptionReceiver的System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()的.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)行为 . <调用> d__1.MoveNext()在C:\ Build \ src \ NServiceBus.Core \ Routing \ MessageDrivenSubscriptions \ SubscriptionReceiverBehavior.cs:第29行---从上一个引发异常的位置开始的堆栈跟踪---在位于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务),位于NServiceBus.MutateIncomingTransportMessageBehavior的System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult() . <Invoke> d__0 .MoveNext()在C:\ Build \ src \ NServiceBus.Core \ Pipeline \ MutateTransportMessage \ MutateIncomingTransportMessageBehavior.cs:第27行---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices . 位于System.Runtime.CompilerServices.ConfiguredTaskAwaitable.Configured的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的TaskAwaiter.ThrowForNonSuccess(任务任务)位于C:\ Build \ src \ NServiceBus.Core \ UnitOfWork \ UnitOfWorkBehavior.cs中的NServiceBus.UnitOfWorkBehavior . <Invoke> d__0.MoveNext()中的TaskAwaiter.GetResult():第26行---来自先前位置的堆栈跟踪结束被抛出---在NServiceBus.UnitOfWorkBehavior的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()中 . <调用> d__0.MoveNext()在C:\ Build \ src \ NServiceBus.Core \ UnitOfWork \ UnitOfWorkBehavior.cs:第49行---在抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . ComperServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()在NServiceBus.ProcessingStatisticsBehavior . <Invoke> d__0.MoveNext()在C:\ Build \ src \ NServiceBus.Core \ Performance \ Statistics \ ProcessingStatisticsBehavior.cs:第25行---栈尾从以前的位置追踪例外情况n被抛出---位于System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于NServiceBus的System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult() .ReceivePerformanceDiagnosticsBehavior . 在C:\ Build \ src \ NServiceBus.Core \ Performance \ Statistics \ ReceivePerformanceDiagnosticsBehavior.cs中的<Invoke> d__2.MoveNext():第40行---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于NServiceBus.TransportReceiveToPhysicalMessageProcessingConnector的System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult() . <Invoke> d__1.MoveNext()在C:\ Build \ src \ NServiceBus.Core \ Pipeline \ Incoming \ TransportReceiveToPhysicalMessageProcessingCo nnector.cs:第37行---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处)在System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()at NServiceBus.MainPipelineExecutor . <Invoke> d _1.MoveNext()在C:\ Build \ src \ NServiceBus.Core \ Pipeline \ MainPipelineExecutor.cs:第32行 - - 从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处 . NServiceBus.Transport.SQLServer.ReceiveStrategy中的ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult() . <TryProcessingMessage> d__12.MoveNext()inC:\ Build \ src \ NServiceBus.SqlServer \ Receiving \ ReceiveStrategy.cs:第33行---从抛出异常的上一个位置开始的堆栈跟踪---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于C:\ Build \ src \的NServiceBus.Transport.SQLServer.ReceiveWithTransactionScope.d__4.MoveNext()中的System.Runtime.CompilerServices.ConfiguredTaskAwaitable1.ConfiguredTaskAwaiter.GetResult() NServiceBus.SqlServer \ Receiving \ ReceiveWithTransactionScope.cs:第99行---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) . 位于NServiceBus.Transport.SQLServer.ReceiveWithTransactionScope.d__1.M的System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()中的TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) C:\ Build \ src \ NServiceBus.SqlServer \ Receiving \ ReceiveWithTransactionScope.cs中的oveNext():第39行

该错误表明以下之一:

  • 防火墙正在阻止DTC

  • 计算机无法通过NetBIOS相互解析

  • 未在一台或两台计算机上启用对网络事务的支持

我在运行应用程序的框和端口135上的SQL Server框中添加了入站和出站异常 .

SQL Server实例正在Azure中的VM上运行 . 我也向网络安全组添加了例外 .

我在两个盒子上启用了DTC的网络连接 .

当VM在DomainB上时,应用程序框在DomainA上运行

我有一段时间绕过这个 . 我需要改变什么才能让它发挥作用?是否有解决方法可以防止升级到DTC?

更新:两个域都通过某种Azure联盟运行,因此他们能够相互ping通,他们只能解析彼此的主机名,所以我将IP地址添加到每个盒子的主机文件中,现在他们可以找到彼此和一切似乎都在起作用 .

所以我现在想,我想知道是否有办法通过某种配置来解决这个问题,这样我就不必为每个应用程序框和每个想要在本地运行测试的开发人员框添加主机条目 .

1 回答

  • 1

    我会尽量避免在你的场景中使用MSDTC,而是使用Outbox feature .

    这有帮助吗?

相关问题