Я использую два именованных кеша в AppFabric:
- CacheA — это просто пары [строка, строка] и не используется каким-либо особым образом.
- CacheB представляет собой пары [строка, объект] (где объект — сериализуемый тип) и используется в качестве хранилища сеансов для сайта ASP.NET MVC4.
У меня есть отдельный проект VS, который пытается перечислить все содержимое кеша и вывести каждый элемент:
foreach (string regionName in cache.GetSystemRegions()) {
foreach (var cacheItem in cache.GetObjectsInRegion(regionName)) {
Trace.WriteLine(String.Format("{0} \t\t {1}", cacheItem.Key, cacheItem.Value));
}
}
Это отлично работает для CacheA, но запуск этого с CacheB вызывает исключение (когда cache.GetObjectsInRegion() возвращает что-то ненулевое):
Assembly 'Microsoft.Web.DistributedCache, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not found. ---> System.Runtime.Serialization.SerializationException: Assembly 'Microsoft.Web.DistributedCache, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' is not found. at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, Int32 declaredTypeID, Type declaredType, String name, String ns) at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, String name, String ns) at System.Runtime.Serialization.NetDataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) at System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader) at Microsoft.ApplicationServer.Caching.Utility.Deserialize(Byte[][] buffers, Boolean checkTypeToLoad, Object context, IEnumerable`1 knownTypes) at Microsoft.ApplicationServer.Caching.Utility.Deserialize(Byte[][] buffers, Boolean checkTypeToLoad, Object context) at Microsoft.ApplicationServer.Caching.Utility.Deserialize(Byte[][] buffers, Boolean checkTypeToLoad) at Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext()
Я обнаружил, что не может прочитать кэшированные данные azure из другого приложения. и добавил ссылку на мой другой проект, который содержит класс, которым эти объекты были до сериализации (на самом деле я хочу просто просмотреть значения, поскольку они сериализованы и сохранены в кеше), но само по себе это ничего не изменило .