我已将我的Windows Azure项目设置为使用我的App Fabric Cache。但是,当我将一个值初始化(Put)到缓存中并将其读回时,在某些情况下它是null或0。这是为什么?
我循环遍历结果集并使用其唯一键存储每个实体,如下所示:
foreach (VideoEntity v in results)
{
videos.Add(v);
videoIDs.Add(v.RowKey);
// save the video to cache
cache.Put(v.RowKey, v, TimeSpan.FromMinutes(1));
}
以下是阅读它的代码:
Func<object, VideoEntity> GetVideoEntity_action = (object obj) =>
{
DataCache tCache = factory.GetDefaultCache();
VideoEntity tempVideo = (VideoEntity)tCache.Get((string)obj);
return tempVideo;
};
当我读到特别是“sortIndex”属性发生了变化的内容时。我假设这是我的代码中的一个错误,但我尽可能地去了最终调用缓存服务的地方,并且只能得出结论缓存服务以某种方式歪曲了这个值?
其他人遇到缓存服务问题,错误值?
我正在使用c#MVC3(ASP.Net 4.0,Windows Azure SDK 2011年11月发行版),Visual Studio 2010 Ultimate。
答案 0 :(得分:0)
AppFabric缓存似乎使用WCF进行序列化,这意味着它尊重各种序列化属性。特别是,如果属性上有[IgnoreDataMember]
属性,则不会缓存该字段。当对象退出时,该字段将具有该类型的默认值。
如果这是你的问题,你可以通过在缓存它们之前使用BinaryFormatter将对象序列化为byte []来解决它。
只是为了验证[IgnoreDataMember]属性是否会导致我提到的问题,这里是一些示例代码。
public class TestClass
{
public int MyInt { get; set; }
}
[DataContract]
public class TestContract
{
[IgnoreDataMember]
public int MyInt { get; set; }
}
public void DataMemberIgnoreTest()
{
//elided creation of the DataCacheFactory here
DataCache cache = factory.GetDefaultCache();
TestClass t1 = new TestClass();
t1.MyInt = 25;
TestContract t2 = new TestContract();
t2.MyInt = 25;
cache.Put("t1", t1);
cache.Put("t2", t2);
TestClass retrievedT1 = cache.Get("t1") as TestClass;
TestContract retrievedT2 = cache.Get("t2") as TestContract;
Console.Out.WriteLine("t1 value: " + retrievedT1.MyInt); //25
Console.Out.WriteLine("t2 value: " + retrievedT2.MyInt); //0
}
虽然我不能肯定这是你的问题,但这是一个明确的可能性。