保持缓存中的对象不变

时间:2012-05-16 12:05:15

标签: c# asp.net xml caching

此代码“完美”工作。创建一个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";
        }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

克隆它是要走的路。

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

XDocument cachedDocument = ... get it from the cache ...
XDocument clone = new XDocument(cachedDocument);
... modify the clone