2

ASP.NET Web フォーム システムに問題があります。

テストサーバーでは機能しましたが、サーバーの1つがDMZ内にあり、SQLサーバーがその外にあります(ただし、ネットワーク上ではまだ-異なるサブネットですが)ライブにしています

これら2つのボックス間のファイアウォールを完全に開いて、それが問題であるかどうかを確認しましたが、「TransactionScope」を使用しようとするたびに、「基礎となるトランザクションマネージャーとの通信に失敗しました」というエラーメッセージが表示されます。データにアクセスして取得できますが、それを壊すのはトランザクションだけです。

また、msdtc ping を使用して接続をテストし、ping が成功するファイアウォールの修正を行いましたが、同じエラーが発生します。

このエラーを解決するにはどうすればよいですか?

私たちは今日稼働するシステムを持っているので、どんな助けも素晴らしいでしょう. パニック :)

編集:以下のようなトランザクションでより簡単なテスト ページを作成しましたが、これは正常に動作します。入れ子になったトランザクションがこの種のエラーを引き起こす可能性がありますか?もしそうなら、なぜこれはファイアウォールを備えた DMZ でライブボックスを使用するときにのみ問題を引き起こすのでしょうか?

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)
4

4 に答える 4

2

私が提供したコードでは、トランザクションが DTC にエスカレートされないことに気付きました。1 つのトランザクション内で複数のデータ コンテキストを使用すると、問題が発生しました。

ファイアウォールが開いていると思っていましたが、ポートの範囲が必要であり、それが問題がまだ発生していた理由です.

この記事は私がそれを解決するのに役立ちました

于 2010-06-18T12:50:35.390 に答える
1

私の場合、VPN経由で試していました。LAN では正常に動作していましたが、VPN では正常に動作していませんでした。また、両方のサイトのハードウェア ファイアウォールでポート (つまり、135,5000-5020) を開きましたが、侵入できませんでした。よく調べた結果、両方のマシンがNetBIOS名と通信できる必要があることがわかりました。ホストファイルに別のマシンのエントリを追加したところ、完全に正常に機能しています。

貴重な助けをしてくれたアンドリューとマイクに感謝します。

ありがとうございました。

于 2016-06-28T07:54:52.537 に答える
0

ポートを開いて MSDTC を構成できることは理解していますが、アプリがインストールされているすべてのクライアントに対してではありません。TransactionScope が DTC に昇格するのをブロックする方法はありますか。私は1つのDBのみで作業していることを知っています。エラーで行われた変更またはエラーが発生した後にコンテキストを破棄するには、複数のコンテキストが必要です。もちろん、最善の方法はオブジェクトをデータ コンテキストから切り離すことですが、この機能は .NET 3.5SP1 Linq to SQL では使用できません。そのため、別のコンテキストで変更を送信し、何か問題が発生した場合は破棄する必要があります。

于 2010-08-14T01:17:37.420 に答える