我已經在我的類庫中實現了緩存,並且遇到問題。我所做的是,我傳遞了一個值,我需要從XML文件讀取,並將返回節點和值。我已經使用字典來存儲子節點作爲鍵值對。請參閱我的XML例子緩存值被覆蓋?
<?xml version="1.0" encoding="utf-8"?>
<Settings>
<Test1>
<CompanyDetails>
<Name>Test1</Name>
<Address1>Add1</Address1>
<Address2>Add2</Address2>
<Address3>Add3</Address3>
<Phone>1111</Phone>
</CompanyDetails>
<Email>
<Contact>[email protected]</Contact>
</Email>
<AdminUsers>
<User1>user1</User1>
<User2>user2</User2>
</AdminUsers>
</Test1>
</Settings>
請參考下面
using System.Web;
public Dictionary<string, string> GetDataFromSettings(string strValues)
{
Dictionary<string, string> dictValus = new Dictionary<string, string>();
XmlDocument xmlDoc = new XmlDocument();
string xmlFilePath = "D:\\Test.xml";
xmlDoc.Load(xmlFilePath);
if (!(xmlDoc == null))
{
string[] splitValues = strValues.Split(new char[] { ',' });
if (splitValues.Length > 1)
{
Dictionary<string, string> strDictValues = new Dictionary<string, string>();
foreach (string strName in splitValues)
{
if (HttpRuntime.Cache[strName.Trim()] == null)
{
strDictValues.Clear();
XmlNodeList xmlList = xmlDoc.SelectNodes("Settings/Test1/" + strName.Trim());
foreach (XmlNode node in xmlList)
{
if (node.FirstChild.Name.ToString() != node.LastChild.Name.ToString())
{
foreach (XmlNode childNode in node.ChildNodes)
{
strDictValues.Add(strName.Trim() + "." + childNode.LocalName, childNode.InnerText);
}
}
else
{
strDictValues.Add(strName.Trim() + "." + node.FirstChild.LocalName, node.InnerText);
}
}
HttpRuntime.Cache.Insert(strName.Trim(), strDictValues,new System.Web.Caching.CacheDependency(xmlFilePath));
}
else
{
Dictionary<string, string> tmpDict = new Dictionary<string, string>();
tmpDict = (Dictionary<string, string>)HttpRuntime.Cache[strName.Trim()];
foreach (var tmpVal in tmpDict)
{
strDictValues.Add(tmpVal.Key, tmpVal.Value);
}
}
foreach (var tmpStrDict in strDictValues)
{
dictValus.Add(tmpStrDict.Key, tmpStrDict.Value);
}
}
}
}
return dictValus;
}
我的代碼在我的XML上述例子中,我將傳遞字符串爲「CompanyDetails,通過電子郵件將」在功能上面,我分裂字符串,然後將每個字符串的值分別存儲在緩存中。當我第一次運行時,「CompanyDetails」下的值被存儲在名爲「CompanyDetails」的緩存中,並且當它用於節點「Email」時,緩存[「CompanyDetails」]被覆蓋,並且緩存[「Email 「]被創建並且它們都具有相同的值。這是不正確的。我無法找到它發生的原因。
謝謝
Jollyguy
你爲什麼這樣做'splitValues.Length> 1'而不是'splitValues.Length> 0'?檢查'> 1'意味着您不會緩存單個密鑰的值。 – dbc 2014-09-04 14:44:54