c# - 读取 AppFabric 内容会引发程序集异常

标签 c# appfabric appfabric-cache

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

  1. CacheA 只是 [string,string] 对,并且不以任何特殊方式使用
  2. CacheB 是 [string,object] 对(其中 object 是可序列化类型),用作 ASP.NET MVC4 站点的 session 存储

我有一个单独的 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()

我看到了unable to read azure cached data from a different application并添加了对我的另一个项目的引用,其中包含这些对象在序列化之前的类(我实际上只想查看序列化并存储在缓存中的值),但仅此一点并没有改变任何内容。

最佳答案

session 项使用 Microsoft.Web.DistributedCache.SerializedSessionStateStoreData 存储在 AppFabric 缓存中。

这是反射(reflect)的代码

[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 上下文之外获取 session 项时,AppFabric 缓存客户端无法反序列化该数据项,因为它是以未知类型(在 Microsoft.Web.DistributedCache.dll 中定义)进行序列化的。

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

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

关于c# - 读取 AppFabric 内容会引发程序集异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17194178/

相关文章:

azure - 适用于 Windows Server 的 AppFabric 仍在开发中吗?

C# - 使用 Response.TransmitFile() 或 Response.WriteFile() 流式传输 PDF,然后选择一个页面

WCF 和 Windows Server 服务总线端点

azure - 本地 Azure 云服务(模拟器)将无法运行

.net - AppFabric - Etw - 无法注销跟踪提供程序

c# - 应用结构 : Is there any difference between default and named cache?

azure - 本地缓存和不可变对象(immutable对象) - 零超时

c# - 有多个同时写入器(没有读取器)到一个文件。是否有可能在 .NET 中以高效的方式完成?

c# - 使用 JSON.NET 将对象序列化为 HttpClient 的响应流

c# - OpenIddict - 如何获取用户的访问 token ?