2013-06-14 12 views
5

Stiamo vivendo il seguente errore (dai log) quando si utilizza il nostro Windows Azure App:irrisolvibili (come ancora) Errore di serializzazione

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

Questo errore va e viene non siamo stati in grado di capire esattamente cosa lo causa

Abbiamo provato di tutto! Qualsiasi aiuto che chiunque potrebbe fornire sarebbe fantastico.

L'intero messaggio di errore dal registro è:

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) 

risposta

2

Senza vedere qualsiasi del codice, è difficile da risolvere. Tuttavia, avevamo qualcosa di simile causato dal fatto che DataContractSerializer prevedeva un tipo specifico (come definito nell'interfaccia del servizio), ma stava invece ottenendo un tipo di proxy EntityFramework.

Abbiamo deciso di utilizzare il modello Oggetto trasferimento dati per risolvere questo problema. Abbiamo creato classi base che erano semplici oggetti di trasferimento dati. Le classi EF-aware ereditano da queste e aggiungono logica relativa alla persistenza.

Questi oggetti DTO implementano ICloneable (o qualcosa di simile) che ci consente di creare facilmente copie di trasferimento dati delle classi proxy di Entity Framework prima di inviare oggetti al serializzatore a livello di servizio.

Potrebbe anche essere possibile risolvere questo problema creando un serializzatore personalizzato che abbia conoscenza delle classi proxy di Entity Framework ma tale approccio sembrava più un trucco. Il modello DTO sembrava più semplice ed era molto efficace.

+0

Grazie per il suggerimento, sembra che ciò implichi un significativo refactoring del codice. È possibile che questo sia solo un problema con il codice di Microsoft? – Trevor

+1

Questo è possibile. Non stavamo usando Windows Azure, quindi potrebbe essere qualcosa di specifico per Azure. Mentre il codice di Microsoft non è perfetto, trovo che il mio tende ad essere ancora meno perfetto e gli errori sono di solito quelli che ho creato. –

Problemi correlati