[Mono-bugs] [Bug 532679] New: Precompiled website with themes causes 'virtualPath' NullException

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Wed Aug 19 22:28:59 EDT 2009


http://bugzilla.novell.com/show_bug.cgi?id=532679


           Summary: Precompiled website with themes causes 'virtualPath'
                    NullException
    Classification: Mono
           Product: Mono: Class Libraries
           Version: 2.4.x
          Platform: x86
        OS/Version: openSUSE 11.1
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: Sys.Web
        AssignedTo: mhabersack at novell.com
        ReportedBy: chrisbrown76 at hotmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---


User-Agent:       Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0;
Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)

Running a precompiled website with an App_Themes folder causes a NullException
for parameter 'virtualPath' when browsing to any page in the site. The site was
written in VB.NET.



Reproducible: Always

Steps to Reproduce:
1. Create new website project in VS.NET (just default.aspx page is ok).
2. Add a theme (do not need to create any theme files e.g css).
3. Precompile site using 'aspnet_compiler'.
4. Run site under XSP and browse to 'Default.aspx'.
Actual Results:  
Following error message:

Argument cannot be null. Parameter name: virtualPath

Description: HTTP 500. Error processing request.

Stack Trace:

System.ArgumentNullException: Argument cannot be null.
Parameter name: virtualPath
  at System.Web.VirtualPathUtility.IsAbsolute (System.String virtualPath)
[0x00000]
  at System.Web.VirtualPathUtility.IsRooted (System.String virtualPath)
[0x00000]
  at System.Web.Compilation.BuildManager.GetAbsoluteVirtualPath (System.String
virtualPath) [0x00000]
  at System.Web.Compilation.BuildManager.FixVirtualPaths () [0x00000]
  at System.Web.Compilation.BuildManager.LoadPrecompilationInfo () [0x00000]
  at System.Web.Compilation.BuildManager..cctor () [0x00000]

Version information: Mono Version: 2.0.50727.1433; ASP.NET Version:
2.0.50727.1433

Expected Results:  
Default.aspx page displays normally.

This bug appears to be occurring because the .compiled file that is created for
the Theme (e.g Theme_Theme1.compiled) has a 'virtualPath' attribute in the
'preserve' node of '/App_Themes/Theme1/'. It also has a 'resultType' of '3'.
This means that in the System.Web.Compilation.BuildManager.LoadPrecompiled
method (called by System.Web.Compilation.BuildManager.LoadPrecompilationInfo)
this compiled file is passed to
System.Web.Compilation.BuildManager.LoadPageData which extracts the virtualPath
and this is in turn later processed by
System.Web.Compilation.BuildManager.FixVirtualPaths. The trailing '/' means
this method ultimately passes an empty string to
System.Web.VirtualPathUtility.IsAbsolute which results in the null exception
(StrUtils.IsNullOrEmpty(virtualPath)).

I resolved this on my system by adding the following method to
System.Web.VirtualPathUtility:

public static bool IsThemeDirectory (string virtualPath)
        {
            string checkPath = ToAppRelative(virtualPath);
            return (checkPath.StartsWith("~/App_Themes/",
StringComparison.InvariantCultureIgnoreCase) ||
(checkPath.StartsWith("/App_Themes/",
StringComparison.InvariantCultureIgnoreCase)));
        }

I also then modified System.Web.Compilation.BuildManager.LoadPageData as
follows to call this method:

static void LoadPageData (XmlTextReader reader)
        {
            PreCompilationData pc_data = new PreCompilationData ();

            while (reader.MoveToNextAttribute ()) {
                string name = reader.Name;
                if (name == "virtualPath")
                    if (!VirtualPathUtility.IsThemeDirectory(reader.Value))
                    {
                        pc_data.VirtualPath = reader.Value;
                    }
                    else
                    {
                        return;
                    }
                else if (name == "assembly")
                    pc_data.AssemblyFileName = reader.Value;
                else if (name == "type")
                    pc_data.TypeName = reader.Value;
            }
            if (precompiled == null)
                precompiled = new Dictionary<string, PreCompilationData>
(comparer);
            precompiled.Add (pc_data.VirtualPath, pc_data);
        }

This resolved the issue when using XSP2 or mod_mono.

-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.


More information about the mono-bugs mailing list