Чтение содержимого AppFabric вызывает исключение сборки

Я использую два именованных кеша в AppFabric:

  1. CacheA — это просто пары [строка, строка] и не используется каким-либо особым образом.
  2. 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 из другого приложения. и добавил ссылку на мой другой проект, который содержит класс, которым эти объекты были до сериализации (на самом деле я хочу просто просмотреть значения, поскольку они сериализованы и сохранены в кеше), но само по себе это ничего не изменило .


person DaveD    schedule 19.06.2013    source источник
comment
Пожалуйста, покажите нам также ваш web.config :)   -  person krishwader    schedule 20.06.2013


Ответы (1)


Элементы сеанса хранятся в кэше AppFabric с использованием Microsoft.Web.DistributedCache.SerializableSessionStateStoreData.

Вот отраженный код

[DataContract]
internal sealed class SerializableSessionStateStoreData
{
    [DataMember(Name = "Keys")]
    private string[] _keys;
    [DataMember(Name = "Values")]
    private object[] _values;
    [DataMember(Name = "Timeout")]
    private int _timeout;
    [DataMember(Name = "SessionStateActions")]
    private SessionStateActions _sessionStateActions;
    public SerializableSessionStateStoreData(SessionStateStoreData storeData, SessionStateActions sessionStateActions)
    {
        ...
    }
    public Tuple<SessionStateStoreData, SessionStateActions> Restore()
    {
        ...
    }
}

Когда вы пытаетесь получить элемент сеанса вне веб-контекста, клиент кэша AppFabric не может десериализовать элемент данных, поскольку он сериализован в неизвестном типе (определенном в Microsoft.Web.DistributedCache.dll).

Добавьте ссылку на Microsoft.Web.DistributedCache.dll.

Для этого также потребуется System.Web.dll, поскольку для этого требуется System.Web.SessionState.SessionStateStoreData

person Cybermaxs    schedule 20.06.2013