Извращающее значение кэша Windows Azure - PullRequest
0 голосов
/ 15 марта 2012

Я настроил свой проект Windows Azure для использования моего App Fabric Cache.Однако, когда я инициализирую (помещаю) значение в кэш и читаю его обратно, в некоторых случаях это либо ноль, либо 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 г.), Visual Studio 2010 Ultimate.

1 Ответ

0 голосов
/ 15 марта 2012

Кэширование AppFabric, кажется, использует WCF для сериализации, что означает, что он учитывает различные атрибуты сериализации.В частности, если у вас есть атрибут [IgnoreDataMember] для свойства, это поле не будет кэшировано.Когда вы возвращаете объект, поле будет иметь значение по умолчанию для этого типа.

Если это ваша проблема, вы можете обойти ее, сериализовав мои объекты в byte [], используя BinaryFormatter, прежде чем их кэшировать.

Пример

Просто чтобы убедиться, что атрибут [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
}

Хотя я не могу точно сказать, что это ваша проблема, это определенная возможность.

...