There is no MTS object context (Exception from HRESULT: 0x8004E004)

System.EnterpriseServices.ServiceDomain gives you an easy to implement distributed transactions. However, we saw a following exception happened intermittently when the ASP.Net pages are switched to run under .Net 2.0.

    System.Runtime.InteropServices.COMException was unhandled
      Message="There is no MTS object context (Exception from HRESULT: 0x8004E004)"
      Source="mscorlib"
      ErrorCode=-2147164156
      StackTrace:
           at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
           at System.EnterpriseServices.ServiceDomain.Leave()

Source code has the issue:

        
    public class AspPage: System.Web.UI.Page
    {    
        protected AspPage()
            : base()
        {
            ServiceConfig config = new ServiceConfig(); 
            config.Transaction = TransactionOption.Required; 
            ServiceDomain.Enter(config);        
        }
        
        protected override void OnUnLoad(EventArgs e)
        {
            base.OnLoad(e);
            ServiceDomain.Leave();  //Throws "There is no MTS object context" exception 
        }
    }

We did some experiments and found that once we move ServiceDomain.Enter into OnLoad, the problem dispears. It seems that .Net 2.0 has a bug or has changed some threading behaviors. A rule of thumb is only call ServiceDomain.Enter from a method or one of the Page events (for example, Page_Load, Page_Init, and so on), and do not call it at construction time.

Problem solved:

        
    public class AspPage: System.Web.UI.Page
    {    
        protected AspPage()
            : base()
        {
        }

        protected override void OnLoad(EventArgs e)
        {
            ServiceConfig config = new ServiceConfig(); 
            config.Transaction = TransactionOption.Required; 
            ServiceDomain.Enter(config);        

            base.OnLoad(e);
        }
        
        protected override void OnUnLoad(EventArgs e)
        {
            base.OnUnLoad(e);
            ServiceDomain.Leave();   
        }
    }

See also

  • SQL: Use Dynamic SQL Query Correctly
  • SQL 2005: Use DMV and CROSS APPLY to Get Cached Plans
  • SQL 2005: Discontinued or Deprecated Features in SQL Server 2005
  • SQL 2005: Default Trace Enabled Option
  • SQL 2005: Column Level Permissions
  • SQL 2005: SQLCMD Supports Parameterized Variables and Macro Features
  • SQL 2005: DTS Has Become SSIS now
  • SQL 2005: Microsoft SQL Server 2005 JDBC Driver
  • SQL 2005: Query Notifications in ADO.Net 2.0
  • SQL 2005: Overcome SQL Index Size Limit
  • SQL 2005: DDL Triggers
  • SQL 2005: Why Should Use 64 Bit Now
  • SQL 2005: How to Rebuild The Master Database
  • SQL 2005: A Little Trick to Install SQL 2005 Onto Your Dirty DEV Machine
  • SQL 2005: New Resource Database
  • SQL 2005: Alter Index Rebuild
  • SQL 2005: XQuery Sample
  • SQL 2005: How to Move Database
  • SQL: Use COALESCE to Generate a List
  • SQL: How to Debug SQL Deadlocks
  • .Net: How to Bypass Strong Name Check
  • Agile: Lean Software Development - An Agile Toolkit
  • ORM: How to Use nHibernate 1.2 to Call Stored Procedure to Return a Dataset Without a Mapping Entity
  • AJAX: ASP.NET AJAX Tips
  • .Net: Debugging Commands
  • .Net: How to Run NUnit And Debug Your Test Fixtures Directly from VS 2005
  • .Net: How to Add Domain User to Local Group
  • .Net: Lock Value Type?
  • .Net: How to Create an Instance of a Generic Type with Parameters
  • .Net: How to Get Address of a Managed Type
  • ORM: New Features of nHibernate 1.2
  • .Net: How to Get System Error Message from HRESULT in Managed Code
  • .Net: Use Windows PowerShell Now
  • WMI: Use WMI to Run Commands on Remote Machine
  • API: GetLogicalProcessorInformation to Detect CPUs
  • .Net: How to Implement Singleton Correctly
  • .Net: There is no MTS object context (Exception from HRESULT: 0x8004E004)
  • .Net: The Net Objectives Pattern Repository
  • Web: Access Denied When ASP.Net Accesses Eventlog
  • Nant: Error Loading GUID of Project
  • AJAX: Ajax in Action
  • DTC: DtcGetTransactionManager Fails
  • .Net: Run .Net 1.1 COM+ Serviced Components Under .Net 2.0 Framework
  • .Net: Debugging Managed Code Tip
  • .Net: Assembly Binding Log Viewer (Fuslogvw.exe)
  • .Net: .Net Framework Design Guidelines
  • .Net: Use Global Catalog and CheckTokenMembership to Check AD Group Membership



  • THIS POST IS PROVIDED "AS-IS" WITH NO WARRANTIES AND CONFERS NO RIGHTS. Build time: Sun 03/30/2008 . ©2007 Dalun Software. All rights reserved. Back to Article List