Recently, I saw a very interesting issue. Thought, I must share...
There were two pages in an application. In the 2nd one (page2.aspx), aspcompat was equal to true. In the first one, we did something with a lot of objects, "stored it in the session", went to page2.aspx and splat!! The following error was thrown up. The weird thing was that, it worked in ASP.NET 1.1, but it simply refused to work in ASP.NET 2.0.
Server Error in '/vs2005 Test web application' Application.
--------------------------------------------------------------------------------
An error was encountered while calling OnStartPage in ASP compatibility mode.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Web.HttpException: An error was encountered while calling OnStartPage in ASP compatibility mode.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[HttpException (0x80004005): An error was encountered while calling OnStartPage in ASP compatibility mode.]
System.Web.Util.AspCompatApplicationStep.OnPageStartSessionObjects() +780634
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1996
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.42; ASP.NET Version:2.0.50727.42
We were quite confused about how to troubleshoot the issue. So, we started with isolation of the objects stored in the session in that page which could be causing it. Very soon we realized that it was because of a custom dataset object that was stored in session. As soon as we commented the line (which added the problematic object to the Session) out, we found that the issue was resolved. Now, the question remained that what was wrong with that object???
At that point, I thought of using "StateServer" mode in web.config, instead of "InProc" http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/gngrfsessionstatesection.asp. As soon as we tried running the application again with the problematic object uncommented, we saw a new error message. I will modify it accordingly because of privacy issues (it doesn't really matter which company's component it was, anyways!!!), but I will give you a glimpse about what the "new" error was...
The constructor to deserialize an object of type 'xxx.yyy.zzz' was not found.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Runtime.Serialization.SerializationException: The constructor to deserialize an object of type 'xxx.yyy.zzz' was not found.
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[SerializationException: The constructor to deserialize an object of type 'xxx.yyy.zzz' was not found.] System.Runtime.Serialization.ObjectManager.GetConstructor(Type t, Type[] ctorParams) +2313073 System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) +99 [SerializationException: The constructor to deserialize an object of type 'xxx.yyy.zzz' was not found.] System.Runtime.Serialization.ObjectManager.CompleteISerializableObject(Object obj, SerializationInfo info, StreamingContext context) +239 System.Runtime.Serialization.ObjectManager.FixupSpecialObject(ObjectHolder holder) +44 System.Runtime.Serialization.ObjectManager.DoFixups() +167 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +203 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) +190 System.Web.Util.AltSerialization.ReadValueFromStream(BinaryReader reader) +745 System.Web.SessionState.SessionStateItemCollection.ReadValueFromStreamWithAssert() +54 System.Web.SessionState.SessionStateItemCollection.DeserializeItem(String name, Boolean check) +257 System.Web.SessionState.SessionStateItemCollection.DeserializeItem(Int32 index) +107 System.Web.SessionState.SessionStateItemCollection.get_Item(Int32 index) +20 System.Web.SessionState.HttpSessionStateContainer.get_Item(Int32 index) +10 System.Web.Util.AspCompatApplicationStep.OnPageStartSessionObjects() +80 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1996
As it can be seen the description is much clear and adding the constructor to deserialize the object of type "xxx.yyy.zzz" fixed the aspcompat issue!!
Until next time...