【问题标题】:XSLT Caching IssueXSLT 缓存问题
【发布时间】:2017-03-21 07:20:23
【问题描述】:

我正在尝试在 C# 中为 XSL 实现缓存。我已经实现了以下代码

   Xsl2Processor xsl = new Xsl2Processor();
        if (HttpContext.Current.Cache.Get("xsl_" + xslPath) == null)
        {
            xsl.Load(xslPath);
            HttpContext.Current.Cache.Insert("xsl_" + xslPath, xsl, new System.Web.Caching.CacheDependency(xslPath));
        }
        else
        {
            xsl = (Xsl2Processor)HttpContext.Current.Cache.Get("xsl_" + xslPath);
        }
        return xsl;

单个用户 ID 可以正常工作。当我同时尝试两个用户 ID 时(负载测试)。用户被切换的数据。为什么会发生这种情况以及解决方案是什么?

【问题讨论】:

  • 您确定这是导致问题的代码吗?例如,显示的代码示例不包含任何“UserID”。此外,如果数据正在切换,那么这很可能是 XML 的问题,而不是 XSLT 的问题。谢谢。
  • 没有缓存的代码运行良好,缓存导致问题。当同时为不同的用户运行时,值在输出 Xml 之间切换。
  • 什么是Xsl2Processor?那是你自己的课吗?
  • 嗨 Martin..Xsl2Processor 是 Saxon 提供的类。
  • 不,这不正确,它不是由 Saxon(或 Saxonica)提供的。它是由第三方开发的项目codeproject.com/Articles/24766/XSL-and-XQuery-in-NET 的一部分。

标签: c# xml xslt saxon


【解决方案1】:

如果不知道您的Xsl2Processor 课程是什么,很难回答这个问题。但在撒克逊人的术语中,XsltExecutable 是已编译样式表的线程安全表示,您可以安全地缓存它,而XsltTransformer(调用Load() 的结果)打算只使用一次 - 您可以使用它一个接一个地运行多个转换(尽管这样做没有任何好处),但是您不能使用它同时运行多个转换。您应该缓存的对象是XsltExecutable

您也没有证明您的缓存逻辑已正确同步以使其成为线程安全的。

【讨论】:

  • 谢谢 Michael,Xsl2Processor 是 SaxonWrapper (Saxon Processor-v2.0.50727)
  • 我不准备下载那个项目并研究源代码。请让我们知道 Xsl2Processor 封装了哪些 Saxon.Api 对象。
猜你喜欢
  • 2011-08-12
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2011-10-30
  • 2011-04-07
  • 2021-10-07
相关资源
最近更新 更多