2

我在 AppFabric 中使用了两个命名缓存:

  1. CacheA 只是成对的 [string,string],并没有以任何特殊方式使用
  2. CacheB 是成对的 [string,object](其中 object 是可序列化的类型),用作 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() 返回非空值时):

未找到程序集“Microsoft.Web.DistributedCache,版本=1.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”。---> System.Runtime.Serialization.SerializationException:未找到程序集“Microsoft.Web.DistributedCache,版本=1.0.0.0,文化=中性,PublicKeyToken=31bf3856ad364e35”。
   在 System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader,Int32 声明类型 ID,类型声明类型,字符串名称,字符串 ns)
   在 System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserialize(XmlReaderDelegator xmlReader,类型声明类型,字符串名称,字符串 ns)
   在 System.Runtime.Serialization.NetDataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader,布尔验证对象名称)
   在 System.Runtime.Serialization.XmlObjectSerializer.InternalReadObject(XmlReaderDelegator 读取器,布尔验证对象名称,DataContractResolver dataContractResolver)
   在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator 读取器,布尔值 verifyObjectName,DataContractResolver dataContractResolver)
   在 System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader 阅读器)
   在 Microsoft.ApplicationServer.Caching.Utility.Deserialize(字节 [] [] 缓冲区,布尔 checkTypeToLoad,对象上下文,IEnumerable`1 knownTypes)
   在 Microsoft.ApplicationServer.Caching.Utility.Deserialize(字节 [] [] 缓冲区,布尔 checkTypeToLoad,对象上下文)
   在 Microsoft.ApplicationServer.Caching.Utility.Deserialize(字节 [] [] 缓冲区,布尔 checkTypeToLoad)
   在 Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext()

我看到无法从不同的应用程序读取 azure 缓存数据,并添加了对我的另一个项目的引用,其中包含这些对象在序列化之前的类(我实际上只想查看它们被序列化并存储在缓存中的值),但仅此一项并没有改变任何事情。

4

1 回答 1

3

会话项目使用 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()
    {
        ...
    }
}

当您尝试在 Web 上下文之外获取会话项时,AppFabric 缓存客户端无法反序列化数据项,因为它以未知类型(在 Microsoft.Web.DistributedCache.dll 中定义)进行了序列化。

添加对Microsoft.Web.DistributedCache.dll的引用

这也需要 System.Web.dll 因为它需要System.Web.SessionState.SessionStateStoreData

于 2013-06-20T12:55:36.973 回答