The IObjectControl::Activate() method failed - Error Code = 0x800a01a8

 

My customer was migrating from Windows 2003 to Windows 2012 R2. Part of the application still ran classic ASP and VB6 COM+ components in IIS. Their COM+ component requires ASP sessions state so IISIntrinsics was enabled for the component. However, in the new Windows 2012 R2 environment, when the VB6 component requested a value from Session the COM application would fail and the COM+ runtime threw this error:

Server Application ID: {G846F1C5-9A3F-4A78-B513-CDEA1048DB9C}

Server Application Instance ID:

{10232175-0BC5-404A-8440-A8EE01644BAD}

Server Application Name: myCOMPlusServer

Error Code = 0x800a01a8 :

COM+ Services Internals Information:

File: com\complus\src\comsvcs\jit\jit.cpp, Line: 538

Comsvcs.dll file version: ENU 2001.12.10530.16384 shp

So why is the Session not available for the COM+ application even though IISIntrinsics was enabled for the COM+ component?

Debugging Notes

The thread handling the ASP call was marked as MULTITHREADED but the VB6 component was compiled with APARTMENTTHREADED. The effect of this combination forces the thread handling the incoming ASP call to switch threads and allow COM marshalling to call into a different COM apartment. The call to the APARTMENTTHREADED context though, does not pass the IISIntrinsics along which is why it’s unavailable to our COM object despite having IISIntrinsics enabled.

So was this the default behavior? And can we control the apartment type IIS uses to launch ASP applications? The answers are No and Yes. Inside the IIS Service manager, the executeInMta was set to ‘true’ for my customer and by default it should be false.

clip_image001