在浏览器中打开大型aspx文件时编译错误CS1647

时间:2013-01-06 17:08:33

标签: c# asp.net xml xslt webforms

我正在使用XML / XSLT创建一个可以变得非常大的aspx页面。即使文件成功创建,当文件大小接近300K时,在浏览器中打开文件时会发出错误:“CS1647:表达式太长或编译太复杂”(尝试使用IE和Chrome)。失败的.NET错误页面上未显示其他有用信息。

我的开发环境是Win7 x64笔记本电脑上的VS 2012 Express for Web。

由于在执行程序期间不会出现此问题,因此无法解决如何解决此问题。任何人都可以提出策略或解决这个问题吗?

修改

用于创建aspx页面的C#代码是

// load the xml file
XmlDocument reportDetails = new XmlDocument();
reportDetails.Load(ReportDetailsPath);
//setup the xslt transform
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(XlsRptPath);
StringWriter sw = new StringWriter();
xslt.Transform(ReportDetails, null, sw);
//create the aspx file
using (StreamWriter outfile = new StreamWriter(aspxPath))
{
    outfile.Write(sw.ToString());
}

2 个答案:

答案 0 :(得分:1)

老问题,并在评论中大致回答。但为了完整起见,让我们回答它;)。您的问题不在于XSLT本身,而在于生成的hits the 300k boundary of maximum expression size in C#文件。你可以做几件事:

  • 使生成的代码低于300k(但在您的情况下可能无法实现)
  • 获取生成的代码中的任何字符串常量并将它们放在一个 资源文件。这些资源文件的格式是XML,您可以 自动生成它,只需确保资源中的ID匹配 您在生成的ASPX中使用的ID
  • 将生成的代码的一部分放在代码隐藏文件中。一个ASPX是 解析为一个表达式,但代码隐藏不是。这是一个 构造生成的代码的问题。
  • 如果您的设计允许,可以在多个页面中拆分ASPX。您可以 将它们与iframe重新组合。
  • 在多个ASCX控件中拆分ASPX文件。这可能是 最自然的事情。可以引用/添加每个ASCX控件 到ASPX文件。每个ASCX控件不应超过300k限制。
  • 如果有很多生成的CSS会破坏大小,请将其放置 在一个单独的CSS文件中。
  • 如果图像引用中有很多长绝对路径,那么 比如,你可以折叠它们并使引用相对,即通过 使用<base>,可以节省一些空间。
  • 如果错误是由实际的大(常量)表达式引起的,请考虑 hints in the answers in this post获得解决方案。

答案 1 :(得分:1)

我很抱歉没有尽快发布我的解决方案,但当时我太紧张了。迟到总比我想的要好。

我没有尝试为每个关联的xml文件创建一个完整的aspx网页,而是创建了一个存根,并在运行时从关联的Site.Master中应用了xslt转换。存根的 MasterPageFile 属性设置为此Site.Master。这种方法确实牺牲了一些性能,但它适用于任何规模的网页。以下是输出 webpage的示例。

示例aspx存根文件:

<%@ Page Title="Top Austin Beauty Salons List" MetaDescription="List of best Google-ranked Austin beauty salon" Language="C#" MasterPageFile="~/Site1.Master" %>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
</asp:Content>

Site.Master Page_Load:

    protected void Page_Load(object sender, EventArgs e)
    {
        string vp =  Page.AppRelativeVirtualPath;
        if (vp.ToLower().EndsWith("default.aspx") || vp.ToLower().EndsWith("webform2.aspx")) return; // ignore some aspx files used for ohter reasons
        string xmlPath = Page.MapPath(vp.Substring(0, vp.LastIndexOf(".")) + @".xml");
        string xslPath = Page.MapPath("mainpage.xslt");
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(xmlPath);
        XsltArgumentList argsList = new XsltArgumentList();
        argsList.AddParam("xmlPath", "", xmlPath);

        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(xslPath);
        // Execute the transform and output the results to a string writer.
        StringWriter sw = new StringWriter();
        xslt.Transform(xmlDoc, argsList, sw);
        content.InnerHtml = sw.ToString(); // add the generated html to the associated stub aspx content section
    }