2013-06-14 10 views
5

Obecnie przeżywa następujący błąd (z bali) podczas korzystania z naszej aplikacji Windows Azure:nierozwiązywalne (jak dotąd) Błąd serializacji

System.Runtime.Serialization.SerializationException Assembly 'EntityFrameworkDynamicProxies-Marriott.emergePortal.Common, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not found. 

Ten błąd pojawia się i znika nie byliśmy w stanie zrozumieć dokładnie to, co go powoduje.

Próbowaliśmy wszystkiego! Każda pomoc, którą ktoś mógłby zapewnić, byłaby niesamowita.

Cały komunikat z dziennika jest:

System.Web.HttpException (0x80004005): Exception of type 'System.Web.HttpException' was thrown. ---> System.Runtime.Serialization.SerializatioFnException: Assembly 'EntityFrameworkDynamicProxies-Marriott.emergePortal.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not found. 
    at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, Int32 declaredTypeID, Type declaredType, String name, String ns) 
    at ReadArrayOfPropertyEnrollmentFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString , XmlDictionaryString , CollectionDataContract) 
    at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
    at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, Int32 declaredTypeID, Type declaredType, String name, String ns) 
    at ReadArrayOfPropertyEnrollmentFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[]) 
    at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
    at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, Int32 declaredTypeID, Type declaredType, String name, String ns) 
    at ReadArrayOfanyTypeFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString , XmlDictionaryString , CollectionDataContract) 
    at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
    at System.Runtime.Serialization.XmlObjectSerializerReadContextComplex.InternalDeserializeInSharedTypeMode(XmlReaderDelegator xmlReader, Int32 declaredTypeID, Type declaredType, String name, String ns) 
    at ReadSerializableSessionStateStoreDataFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString[] , XmlDictionaryString[]) 
    at System.Runtime.Serialization.ClassDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
    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.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 
    at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(XmlDictionaryReader reader) 
    at Microsoft.ApplicationServer.Caching.NetDataContractCacheObjectSerializer.Deserialize(Stream stream) 
    at Microsoft.ApplicationServer.Caching.DataCacheObjectSerializationProvider.DeserializeUserObject(Byte[][] serializedData, ValueFlagsVersion flagsType) 
    at Microsoft.ApplicationServer.Caching.SocketClientProtocol.GetAndLock(String key, TimeSpan timeout, DataCacheLockHandle& lockHandle, String region, Boolean lockKey, IMonitoringListener listener) 
    at Microsoft.ApplicationServer.Caching.DataCache.<>c__DisplayClass8a.<GetAndLock>b__89() 
    at Microsoft.ApplicationServer.Caching.DataCache.GetAndLock(String key, TimeSpan timeout, DataCacheLockHandle& lockHandle) 
    at Microsoft.Web.DistributedCache.DataCacheForwarderBase.<>c__DisplayClass31`1.<PerformCacheOperation>b__30() 
    at Microsoft.Web.DistributedCache.DataCacheRetryWrapper.PerformCacheOperation(Action action) 
    at Microsoft.Web.DistributedCache.DataCacheForwarderBase.GetAndLock(String key, TimeSpan timeout, DataCacheLockHandle& lockHandle) 
    at Microsoft.Web.DistributedCache.BlobBasedSessionStoreProvider.GetItem(HttpContextBase context, String id, Boolean acquireWriteLock, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) 
    at Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider.GetItemExclusive(HttpContext context, String id, Boolean& locked, TimeSpan& lockAge, Object& lockId, SessionStateActions& actions) 
    at System.Web.SessionState.SessionStateModule.GetSessionStateItem() 
    at System.Web.SessionState.SessionStateModule.PollLockedSessionCallback(Object state) 
    at System.Web.SessionState.SessionStateModule.EndAcquireState(IAsyncResult ar) 
    at System.Web.HttpApplication.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar) 

Odpowiedz

2

Nie widząc dowolnego kodu, jest to trudne do rozwiązania. Jednak mieliśmy coś podobnego, co było spowodowane tym, że DataContractSerializer oczekiwał określonego typu (zdefiniowanego w interfejsie usługi), ale zamiast tego otrzymał typ proxy EntityFramework.

Postanowiliśmy użyć wzorca obiektów przenoszenia danych, aby rozwiązać ten problem. Stworzyliśmy klasy bazowe, które były prostymi obiektami do przesyłania danych. Klasy posiadające cechy EF dziedziczą z nich i dodają logikę związaną z utrwalaniem.

Te obiekty DTO implementują funkcję ICloneable (lub coś podobnego), co pozwala na łatwe tworzenie kopii transferu danych klas proxy Entity Framework przed wysłaniem obiektów do serializera na poziomie usługi.

Może być również możliwe rozwiązanie tego problemu poprzez utworzenie niestandardowego serializera, który ma wiedzę na temat klas proxy proxy Entity Framework, ale to podejście wydawało się bardziej hackowe. Wzór DTO wydawał się prostszy i był bardzo skuteczny.

+0

Dziękuję za sugestię, wydaje się, że wymagałoby to znaczącego refaktora kodu. Czy to możliwe, że jest to tylko problem z kodem Microsoftu? – Trevor

+1

To jest możliwe. Nie korzystaliśmy z Windows Azure, więc może to być coś specyficznego dla platformy Azure. Chociaż kod Microsoftu nie jest doskonały, uważam, że moje są jeszcze mniej doskonałe, a błędy są zazwyczaj tymi, które stworzyłem. –

Powiązane problemy