7

我正在使用 XML/XSLT 创建一个可以变得非常大的 aspx 页面。即使文件创建成功,当文件大小接近 300K 时,在浏览器中打开文件(IE 和 Chrome 都试过)时会出现错误:“CS1647: An expression is too long or complex to compile”。失败的 .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());
}
4

2 回答 2

1

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

  • 使生成的代码低于 300k(但在您的情况下这可能是不可能的)
  • 在生成的代码中获取任何字符串常量并将它们放在资源文件中。此类资源文件的格式是 XML,您可以自动生成它,只需确保资源中的 ID 与您在生成的 ASPX 中使用的 ID 匹配
  • 将部分生成的代码放在代码隐藏文件中。ASPX 被解析为一个表达式,但代码隐藏不是。这是构建生成代码的问题。
  • 如果您的设计允许,将 ASPX 拆分为多个页面。您可以将它们与 iframe 重新组合。
  • 在多个 ASCX 控件中拆分 ASPX 文件。这也许是最自然的事情。每个 ASCX 控件都可以引用/添加到 ASPX 文件中。每个 ASCX 控件不应超过 300k 限制。
  • 如果有大量生成的 CSS 会导致尺寸变大,请将其放在单独的 CSS 文件中。
  • 如果图像引用等中有很多长的绝对路径,您可以折叠它们并使引用相对,即使用<base>,这样可以节省一些空间。
  • 如果错误是由实际的大(常量)表达式引起的,请考虑 本文答案中的提示以寻求解决方案。
于 2014-08-18T13:12:58.953 回答
1

我很抱歉没有早点发布我的解决方案,但当时我压力太大而无法这样做。我猜迟到总比没有好。

我没有尝试为每个关联的 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>

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
    }
于 2014-08-18T18:42:50.460 回答