Windows Azure缓存变态值

时间:2012-03-15 03:37:06

标签: windows caching azure appfabric

我已将我的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。

1 个答案:

答案 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
}

虽然我不能肯定这是你的问题,但这是一个明确的可能性。