2017-03-21 169 views
0

我想在C#中为XSL实现缓存。我实施了以下代码XSLT缓存问题

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同时(负载测试)。用户获得切换的数据。为什么发生这种情况,解决方案是什么?

+0

你确定这是导致问题的代码吗?例如,显示的代码示例不包含任何“UserID”。此外,如果数据正在切换,那么更可能是XML的问题,而不是XSLT。谢谢。 –

+0

没有Cache的代码工作正常,带Cache导致问题。当为不同的User同时运行时,Value在Output Xml之间切换。 – user2642517

+0

什么是'Xsl2Processor'?那是你自己的班级吗? –

回答

0

这是很难回答这个问题不知道你Xsl2Processor类是什么。但在撒克逊方面,XsltExecutable是编译的样式表,你可以安全地高速缓存,而XsltTransformer(调用Load()的结果)旨在只能使用一次的线程安全的表现 - 你可以用它来运行多个变换一个之后(尽管这样做没有好处),但不能用它同时运行多个转换。您应该缓存的对象是XsltExecutable

你还显示,没有证据表明缓存逻辑正确同步,使其线程安全的。

+0

感谢迈克尔的SAXON 9.0.0.2,Xsl2Processor是SaxonWrapper(撒克逊处理器-V2.0.50727) – user2642517

+0

我不准备下载项目和研究的源代码。请让我们知道什么Saxon.Api对象被Xsl2Processor封装。 –