caching - Windows Azure Cache Perverting Value

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har konfigureret mit Windows Azure-projekt til at bruge min App Fabric Cache. Men når jeg initialiserer (sæt) en værdi i cachen og læser den tilbage, er den enten null eller 0 i nogle tilfælde. Hvorfor er dette?


Jeg løber gennem et resultatsæt og lagrer hver enhed med sin unikke nøgle som sådan:


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));
}


og her er koden for at læse den tilbage:


Func<object, VideoEntity> GetVideoEntity\_action = (object obj) =>
{
    DataCache tCache = factory.GetDefaultCache();
    VideoEntity tempVideo = (VideoEntity)tCache.Get((string)obj);
    return tempVideo;
};


Da jeg læste, hvad der gik ind i, hvad der kom ud, var 'sortIndex' egenskaben ændret. Jeg antager det er en fejl i min kode, men gik så vidt jeg kunne til, hvor det endelig kalder cachetjenesten og kan kun konkludere, at caching-tjenesten forvrider værdien på en eller anden måde?


Alle andre der har problemer med caching-tjenesten, manglende værdier?


Jeg bruger c # MVC3 (ASP.Net 4.0, Windows Azure SDK November 2011 release), Visual Studio 2010 Ultimate.

Bedste reference


AppFabric Caching synes at bruge WCF til serialisering, hvilket betyder, at den respekterer de forskellige serialiseringsattributter. Især hvis du har attributten [IgnoreDataMember] på en egenskab, vil dette felt ikke blive cachelagret. Når du genstarter objektet, vil feltet have standardværdien for den pågældende type.


Hvis det er dit problem, kan du arbejde rundt ved at serialisere mine objekter til byte [[]] ved hjælp af en BinaryFormatter, før de caches dem.


Eksempel



Bare for at bekræfte, at attributten [[IgnoreDataMember]] vil forårsage det problem, jeg nævnte, her er nogle prøvekode.


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
}


Selvom jeg ikke kan sige sikkert, at dette er dit problem, er det en konkret mulighed.