【发布时间】:2010-03-23 08:13:42
【问题描述】:
我的 ASP.NET Web 表单系统出现问题。
它在我们的测试服务器上运行,但现在我们将其投入使用,其中一台服务器位于 DMZ 内,而 SQL 服务器位于该服务器之外(尽管仍在我们的网络上 - 尽管是不同的子网)
我已经完全打开了这两个框之间的防火墙,看看是否是问题所在,但每当我们尝试使用“TransactionScope”时,它仍然会给出错误消息“与底层事务管理器的通信失败”。我们可以访问数据进行检索,它只是破坏它的事务。
我们也用msdtc ping测试过连接,在防火墙上修改ping成功,还是出现同样的错误!
我该如何解决这个错误?
任何帮助都会很棒,因为我们今天有一个可以上线的系统。恐慌:)
编辑:我创建了一个更简单的测试页面,其中包含如下事务,并且效果很好。嵌套事务会导致这种错误吗?如果会,为什么只会在带防火墙的 dmz 中使用 live box 时才会导致问题?
AuditRepository auditRepository = new AuditRepository();
try
{
using (TransactionScope scope = new TransactionScope())
{
auditRepository.Add(DateTime.Now, 1, "TEST-TRANSACTIONS#1", 1);
auditRepository.Save();
auditRepository.Add(DateTime.Now, 1, "TEST-TRANSACTIONS#2", 1);
auditRepository.Save();
scope.Complete();
}
}
catch (Exception ex)
{
Response.Write("Test Error For Transaction: " + ex.Message + "<br />" + ex.StackTrace);
}
这是我们在问题发生时得到的 ErrorStack: 在
System.Transactions.TransactionInterop.GetOletxTransactionFromTransmitterPropigationToken(Byte[]
propagationToken) at
System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
at System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
at System.Transactions.EnlistableStates.Promote(InternalTransaction tx) at
System.Transactions.Transaction.Promote() at
System.Transactions.TransactionInterop.ConvertToOletxTransaction(Transaction
transaction) at System.Transactions.TransactionInterop.GetExportCookie(Transaction
transaction, Byte[] whereabouts) at
System.Data.SqlClient.SqlInternalConnection.GetTransactionCookie(Transaction
transaction, Byte[] whereAbouts) at
System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) at
System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx) at
System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction) at
System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction
transaction) at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection
owningObject) at
System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection
owningConnection) at
System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection
outerConnection, DbConnectionFactory connectionFactory) at
System.Data.SqlClient.SqlConnection.Open() at
System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) at
System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() at
System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() at
System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression
query) at
System.Data.Linq.ChangeDirector.StandardChangeDirector.DynamicInsert(TrackedObject
item) at System.Data.Linq.ChangeDirector.StandardChangeDirector.Insert(TrackedObject
item) at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) at
System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) at
System.Data.Linq.DataContext.SubmitChanges() at RegBook.classes.DbBase.Save() at
RegBook.usercontrols.BookingProcess.confirmBookingButton_Click(Object sender, EventArgs e)
【问题讨论】:
-
两个盒子上的 msdtc 安全设置如何?是否允许入站和出站?
-
另外,请确保 msdtc 在防火墙例外中。
-
当前允许远程客户端、入站/出站且不需要身份验证(仅更改了这个)。使用多个数据上下文或数据库连接时似乎是一个问题,因为它升级到 MSDTC。我让我们的技术团队暂时解锁防火墙并打开两台服务器的所有端口,MSDTC ping 工具正常工作,但仍然出现错误。我想哭:)
标签: asp.net transactionscope mstdc