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

本文关键字:文件 编译 错误 CS1647 aspx 大型 浏览器 | 更新日期: 2023-09-27 17:50:47

我正在使用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());
}

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

老问题,大部分在评论中得到了回答。但为了完整起见,让我们来回答这个问题;)。您的问题不在于XSLT本身,而在于生成的文件达到了c#中最大表达式大小的300k边界。您可以做以下几件事:

  • 使生成的代码低于300k(但这在您的情况下可能不可能)
  • 在生成的代码中取任意字符串常量,并将它们放在资源文件。这些资源文件的格式是XML,您可以自动生成它,只需确保资源中的id与在生成的ASPX
  • 中使用的id将生成的部分代码放在代码隐藏文件中。ASPX是作为一个表达式解析,但代码背后不是。这是一个构建生成的代码的问题。如果你的设计允许的话,将ASPX拆分为多个页面。你可以用iframe重新组合。
  • 将ASPX文件拆分为多个ASCX控件。这也许是这是最自然的事。每个ASCX控件都可以被引用/添加到ASPX文件。每个ASCX控件不应超过300k的限制。
  • 如果有很多生成的CSS会放大大小,那就把它放好
  • 如果在图片引用中有很多长的绝对路径和例如,您可以折叠它们并使引用相对,即by使用<base>,这样可以节省一些空间。
  • 如果错误是由实际的大(常量)表达式引起的,则考虑在这篇文章的答案提示一个解决方案。

我很抱歉没有尽快发布我的解决方案,但我当时压力太大了。迟来总比不来好。

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

示例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>

网站。主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
    }