0

这段代码“完美”地工作。创建一个 XDocument,将其放入缓存中,并在下一轮检索它。

但是我希望缓存中的对象不受标记位置之后所做的更改的影响,我在其中添加了一些仅在此会话中有效的元素。

缓存中的对象与页面上的所有用户相关,因此在缓存生命周期内只应生成/更改一次。

我可以从缓存中克隆它或将其存储为我猜想的字符串(不是引用类型)并丢失到新的 XDocument 中,但是最温和的方法是什么?似乎有点矫枉过正,当我可以按原样缓存 XDocument 时......

提前致谢,

斯蒂恩

{
            string cachekey = "categories";
            var cateGoryDoc = HttpRuntime.Cache.Get(cachekey) as XDocument;

            if (cateGoryDoc == null)
            {
                XDocument doc = XDocument.Parse(this.ProductList1.getXML());
                IEnumerable<XElement> mainCats =
                    from Category1 in doc.Descendants("product").Descendants("category") select Category1;
                var cDoc = new XDocument(new XDeclaration("1.0", "utf-8", null), new XElement("root"));
                cDoc.Root.Add(mainCats);
                cateGoryDoc = cDoc;
                HttpRuntime.Cache.Insert(cachekey, cDoc, null,
                                             DateTime.Now.AddMinutes(10),
                                             TimeSpan.Zero);
            }


            // I DO NOT WANT TO CHANGE THE DOC IN CACHE!!
            if (HttpContext.Current.Request["tCats"] != null)
            {
                string[] tCats = HttpContext.Current.Request["tCats"].Split(Convert.ToChar(","));

                foreach (string tCat in tCats)
                {
                    cateGoryDoc.Root.Add(new XElement("selectedCategory", tCat));
                }
            }

            this.catecoryXML.DocumentContent = cateGoryDoc.ToString();
            this.catecoryXML.TransformSource = "/XSLTFile1.xslt";
        }
4

2 回答 2

2

创建一个新的 XDocument。将内容从您从缓存中检索到的内容复制到您创建的内容中。

于 2012-05-16T12:08:37.753 回答
2

克隆它是要走的路。

您可以按如下方式执行此操作:

XDocument cachedDocument = ... get it from the cache ...
XDocument clone = new XDocument(cachedDocument);
... modify the clone
于 2012-05-16T12:10:28.230 回答