1

AppfabricDataCacheで奇妙な問題が発生しています。場合によっては、1000分の1の場合、キャッシュのGetメソッドcache.Get(key);public object Get(string key))から例外が発生することがあります。例外は

タイプ'System.Collections.Generic.List`1[MyNamespace.PersonName]'のオブジェクトは、タイプ'MyNamespace.StatusType'に変換できません。

なぜこの変換を行おうとしているのですか?StatusTypeタイプは、PersonNameタイプとは関係がなく、オブジェクトグラフにはまったく含まれていません。

これはDataCacheの内部であり、前述のように、問題なく数日間実行され、その後、このような例外をスローし始めることがあります。オブジェクト(およびオブジェクトグラフ)はすべて十分に単純です。そしてそれは99%の時間動作します。

スタックトレース:

at System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast)
   at System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr)
   at System.Reflection.RtFieldInfo.InternalSetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, CultureInfo culture, Boolean doVisibilityCheck, Boolean doCheckConsistency)
   at System.Runtime.Serialization.FormatterServices.SerializationSetValue(MemberInfo fi, Object target, Object value)
   at System.Runtime.Serialization.FormatterServices.PopulateObjectMembers(Object obj, MemberInfo[] members, Object[] data)
   at Castle.DynamicProxy.Serialization.ProxyObjectReference.DeserializeProxyState()
   at Castle.DynamicProxy.Serialization.ProxyObjectReference..ctor(SerializationInfo info, StreamingContext context)
   at ReadProxyObjectReferenceFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )
   at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
   at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, Int32 declaredTypeID, Type declaredType, String name, String ns)
   at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, String name, String ns)
   at ReadPersonFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[] )
   at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context)
   at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader)
   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)
   at Microsoft.ApplicationServer.Caching.RoutingClient.SendMsgAndWait(RequestBody reqMsg)
   at Microsoft.ApplicationServer.Caching.DataCache.SendReceive(RequestBody reqMsg)
   at Microsoft.ApplicationServer.Caching.DataCache.InternalGet(String key, DataCacheItemVersion& version, String region)
   at Microsoft.ApplicationServer.Caching.DataCache.Get(String key)
   at MyNamespace.CacheManagement.AppFabricCacheProvider.Get(String key)
4

1 に答える 1

0

最終的にこれを追跡しました。

この問題は、タイプの構造を変更した場合に、同じタイプのキャッシュされたバージョンがキャッシュにあり、古いタイプのキャッシュされたインスタンスを新しいタイプに取得しようとした場合に発生する可能性があります。

複数の開発者が同じタイプで作業し、同じグローバルキャッシュを共有している環境では、これに遭遇することになります。

タイプインターフェイスが静的である本番環境では発生しません。

public class Foo // version 1.0
{
 public string Woof {get;set;}
 public FooBar Meow {get;set;}
}
// compile, run,
// add an instance of Foo to AppFabric Cache, cacheKey = X

// 5 mins later
public class Foo // version 1.1
{
 public int Id {get;set;} // change interface of type
 public string Woof {get;set;}
 public FooBar Meow {get;set;}
}

// compile, run, get an instance of Foo from the cache, cacheKey = X
// exception, with strange information.
于 2012-06-26T16:38:00.447 に答える