2010-03-23 76 views
2

我的ASP.NET Web表單系統出現問題。MSDTC - 與底層事務管理器的通信失敗(防火牆打開,MSDTC網絡訪問)

它的工作我們的測試服務器上,但現在我們把它生活在其中一臺服務器一個DMZ內和SQL服務器之外的是(我們的網絡上仍然不過 - 雖然不同的子網)

我在這兩個盒子之間完全打開防火牆,看看是否是這個問題,並且每當我們嘗試使用「TransactionScope」時,它仍然會給出錯誤消息「與底層事務管理器的通信失敗」。我們可以訪問數據進行檢索,這只是破壞數據的事務。

我們還使用msdtc 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) 
+0

如何在兩個方框上的msdtc安全設置?它允許入站和出站? – pdiddy 2010-03-23 14:30:04

+0

另外,請確保msdtc處於防火牆例外狀態。 – pdiddy 2010-03-23 14:32:07

+0

當前允許遠程客戶端,入站/出站和無需身份驗證(只需更改這一個)。在升級到MSDTC時使用多個數據上下文或數據庫連接似乎是一個問題。我讓我們的技術團隊臨時解鎖防火牆並打開兩臺服務器和MSDTC ping工具的所有端口,但仍然出現錯誤。我想哭 :) – Andrew 2010-03-23 15:25:16

回答

2

我意識到我提供不會升級事務的DTC的代碼。在一個事務中使用多個數據上下文時,我遇到了問題。

雖然我認爲防火牆是開放的,但它需要一系列的端口,這就是爲什麼問題仍然存在。

This article helped me resolve it

0

我知道你可以打開端口和配置MSDTC,但不適合在安裝您的應用程序的所有客戶端。有沒有辦法阻止TransactionScope升級到DTC。 我知道我只使用一個數據庫。我只需要多個上下文來處理上下文,其中發生了錯誤或錯誤發生後所做的更改。當然,最好的方法是從數據上下文中分離對象,但在.NET 3.5SP1 Linq to SQL中不提供此功能。 所以我必須在不同的環境下提交更改,並在出現問題時將其丟棄。

0

以下是一些PowerShell腳本,可以進行所有必要的更改以使DTC正常工作。你必須在參與交易的兩臺機器上運行它,即你的web服務器和sql server機器。

function Enable-MSDTC 
{ 
    [CmdletBinding()] 
    param() 

    Write-Host "Updating registry entries for MSDTC" 
    $msdtcRegKey = "HKLM:\SOFTWARE\Microsoft\MSDTC\Security" 

    Set-ItemProperty -Path $msdtcRegKey -Name "NetworkDtcAccessTransactions" -Value 1 
    Set-ItemProperty -Path $msdtcRegKey -Name "NetworkDtcAccess" -Value 1 
    Set-ItemProperty -Path $msdtcRegKey -Name "NetworkDtcAccessOutbound" -Value 1 
    Set-ItemProperty -Path $msdtcRegKey -Name "NetworkDtcAccessClients" -Value 1 
    Set-ItemProperty -Path $msdtcRegKey -Name "NetworkDtcAccessInbound" -Value 1 
    Set-ItemProperty -Path $msdtcRegKey -Name "LuTransactions" -Value 1 

    #Configure MSDTC to use specific ports 
    #see: https://support.microsoft.com/en-us/kb/250367 
    $msdtcPortKey = "HKLM:\SOFTWARE\Microsoft\Rpc\Internet" 
    New-Item -Path $msdtcPortKey 
    New-ItemProperty -Path $msdtcPortKey -Name "Ports" -PropertyType "MultiString" -Value "5000-5200" 
    New-ItemProperty -Path $msdtcPortKey -Name "PortsInternetAvailable" -PropertyType "String" -Value "Y" 
    New-ItemProperty -Path $msdtcPortKey -Name "UseInternetPorts" -PropertyType "String" -Value "Y" 

    #open firewall ports 135, 1433, 5000-5100 
    #also add MSDTC program exclusion 

    netsh advfirewall firewall add rule name='MSDTC Endpoint Mapper (In)' localport=135 dir=in action=allow protocol=TCP 
    netsh advfirewall firewall add rule name='MSDTC SQL Server (In)' localport=1433 dir=in action=allow protocol=TCP 
    netsh advfirewall firewall add rule name='MSDTC Dynamic Ports (In)' localport=5000-5200 dir=in action=allow protocol=TCP 
    netsh advfirewall firewall add rule name='MSDTC exe' dir=in action=allow program=$env:windir\system32\msdtc.exe enable=yes 

    Write-Host "Restarting MSDTC service" 
    #restart the MSDTC service 
    Restart-Service MSDTC -Force -Confirm:$false 
} 

Enable-MSDTC -ErrorAction SilentlyContinue 
0

在我的情況下,我試圖通過VPN。它在局域網中工作得非常好,但不在VPN中。我還在兩個站點上打開了硬件防火牆中的端口(即135,5000-5020),但是這些端口已被入侵。在搜索了很多之後,我開始知道,這兩臺機器都應該能夠與他們的NetBIOS名稱通信。我剛剛在主機文件&中添加了另一臺機器的條目,現在它已經完美無瑕。

謝謝安德魯&邁克爲寶貴的幫助。

謝謝。