2009-05-15 24 views
21

Ho un servizio Web che funziona bene in un ambiente ma non in un altro.Come risolvere questo errore, "errore durante il tentativo di deserializzare il parametro"

Il servizio Web ottiene metadati del documento da SharePoint, è in esecuzione su un server in cui non posso eseguire il debug ma con la registrazione ho confermato che il metodo entra ed esce correttamente.

Quale potrebbe essere il motivo degli errori?

Il messaggio di errore è,

The formatter threw an exception while trying to deserialize the message: 

There was an error while trying to deserialize parameter http://CompanyName.com.au/ProjectName:GetDocumentMetaDataResponse. 

The InnerException message was 'Error in line 1 position 388. 'Element' 'CustomFields' from namespace 'http://CompanyName.com.au/ProjectName' is not expected. 

Expecting element 'Id'.'. Please see InnerException for more details. 

L'InnerException stato

System.ServiceModel.Dispatcher.NetDispatcherFaultException è stato catturato Messaggio = "Il formattatore ha generato un'eccezione durante il tentativo di deserializzare il messaggio: Ci è stato un errore durante il tentativo di deserializzare il parametro http://CompanyName.com.au/ProjectName:GetDocumentMetaDataResponse.

Il messaggio InnerException era

'Error in line 1 position 388. 
'Element' 'CustomFields' 
from namespace 'http://CompanyName.com.au/ProjectName' is not expected. 
Expecting element 'Id'.'. Please see InnerException for more details." 



    Source="mscorlib" 
    Action="http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher/fault" 
    StackTrace: 
    Server stack trace: 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameter(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameters(XmlDictionaryReader reader, PartInfo[] parts, Object[] parameters, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest) 
     at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters) 
     at System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc) 
     at System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc) 
     at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout) 
     at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs) 
     at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
     at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 
    Exception rethrown at [0]: 
     at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
     at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 
     at CompanyName.ProjectName.External.Sharepoint.WebServiceProxies.SharepointProjectNameSiteService.ProjectNameSiteSoap.GetDocumentMetaData(GetDocumentMetaDataRequest request) 
     at CompanyName.ProjectName.External.Sharepoint.WebServiceProxies.SharepointProjectNameSiteService.ProjectNameSiteSoapClient.CompanyName.ProjectName.External.Sharepoint.WebServiceProxies.SharepointProjectNameSiteService.ProjectNameSiteSoap.GetDocumentMetaData(GetDocumentMetaDataRequest request) in D:\Source\TFSRoot\ProjectName\trunk\CodeBase\External\CompanyName.ProjectName.External.Sharepoint.WebServiceProxies\Service References\SharepointProjectNameSiteService\Reference.cs:line 2141 
     at CompanyName.ProjectName.External.Sharepoint.WebServiceProxies.SharepointProjectNameSiteService.ProjectNameSiteSoapClient.GetDocumentMetaData(ListSummaryDto listSummary, FileCriteriaDto criteria, List`1 customFields) in D:\Source\TFSRoot\ProjectName\trunk\CodeBase\External\CompanyName.ProjectName.External.Sharepoint.WebServiceProxies\Service References\SharepointProjectNameSiteService\Reference.cs:line 2150 
     at CompanyName.ProjectName.Services.Shared.SharepointAdapter.GetDocumentMetaData(ListSummaryDto listSummary, FileCriteriaDto criteria, List`1 customFields) in D:\Source\TFSRoot\ProjectName\trunk\CodeBase\Services\CompanyName.ProjectName.Services\Shared\SharepointAdapter.cs:line 260 
     at CompanyName.ProjectName.Services.Project.ProjectDocumentService.SetSharepointDocumentData(List`1 sourceDocuments) in D:\Source\TFSRoot\ProjectName\trunk\CodeBase\Services\CompanyName.ProjectName.Services\Project\ProjectDocumentService.cs:line 1963 
     at CompanyName.ProjectName.Services.Project.ProjectDocumentService.GetProjectConversionDocumentsImplementation(Int32 projectId) in D:\Source\TFSRoot\ProjectName\trunk\CodeBase\Services\CompanyName.ProjectName.Services\Project\ProjectDocumentService.cs:line 3212 
    InnerException: System.Runtime.Serialization.SerializationException 
     Message="Error in line 1 position 388. 'Element' 'CustomFields' from namespace 'http://CompanyName.com.au/ProjectName' is not expected. Expecting element 'Id'." 
     Source="System.Runtime.Serialization" 
     StackTrace: 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.ThrowRequiredMemberMissingException(XmlReaderDelegator xmlReader, Int32 memberIndex, Int32 requiredIndex, XmlDictionaryString[] memberNames) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.GetMemberIndexWithRequiredMembers(XmlReaderDelegator xmlReader, XmlDictionaryString[] memberNames, XmlDictionaryString[] memberNamespaces, Int32 memberIndex, Int32 requiredIndex, ExtensionDataObject extensionData) 
      at ReadFileMetaDataDtoFromXml(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.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContract& dataContract) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns) 
      at ReadArrayOfFileMetaDataDtoFromXml(XmlReaderDelegator , XmlObjectSerializerReadContext , XmlDictionaryString , XmlDictionaryString , CollectionDataContract) 
      at System.Runtime.Serialization.CollectionDataContract.ReadXmlValue(XmlReaderDelegator xmlReader, XmlObjectSerializerReadContext context) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue(DataContract dataContract, XmlReaderDelegator reader) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContract& dataContract) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns) 
      at ReadMetaDataSearchResultsDtoFromXml(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.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContract& dataContract) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Int32 id, RuntimeTypeHandle declaredTypeHandle, String name, String ns) 
      at ReadGetDocumentMetaDataResponseBodyFromXml(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.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator reader, String name, String ns, DataContract& dataContract) 
      at System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator xmlReader, Type declaredType, DataContract dataContract, String name, String ns) 
      at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName) 
      at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName) 
      at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) 
      at System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart(XmlDictionaryReader reader, PartInfo part, Boolean isRequest) 
     InnerException: 

risposta

6

ho una soluzione per questo, ma non sono sicuro sul motivo per cui questo sarebbe diverso da un ambiente all'altro - anche se una grande differenza tra i due ambienti è WSS SVC Pack 1 è stato installato l'ambiente in cui l'errore stava accadendo.

Per risolvere questo problema ho ottenuto un buon indizio da questo link - http://silverlight.net/forums/t/22787.aspx cioè a "controllare l'XML Schema del vostro servizio" e "la sequenza nello schema è in ordine alfabetico"

Guardando il WSDL generato Ho notato che per la classe serializzata che causava l'errore, le proprietà di questa classe non erano visibili in wsdl.

La definizione della classe aveva setter private per la maggior parte delle proprietà, ma non per CustomFields proprietà cioè ..

[Serializable] 
public class FileMetaDataDto 
{ 
    . 
    . a constructor... etc and several other properties edited for brevity 
    . 

    public int Id { get; private set; } 
    public string Version { get; private set; } 
    public List<MetaDataValueDto> CustomFields { get; set; } 

} 

Sulla rimozione privato dal setter e ridistribuire il servizio poi guardando il WSDL di nuovo, queste proprietà erano ora visibili e l'errore originale era stato corretto.

Così il WSDL prima di aggiornamento è stato

- <s:complexType name="ArrayOfFileMetaDataDto"> 
- <s:sequence> 
    <s:element minOccurs="0" maxOccurs="unbounded" name="FileMetaDataDto" nillable="true" type="tns:FileMetaDataDto" /> 
    </s:sequence> 
    </s:complexType> 
- <s:complexType name="FileMetaDataDto"> 
- <s:sequence> 
    <s:element minOccurs="0" maxOccurs="1" name="CustomFields" type="tns:ArrayOfMetaDataValueDto" /> 
    </s:sequence> 
    </s:complexType> 

WSDL dopo l'aggiornamento era

- <s:complexType name="ArrayOfFileMetaDataDto"> 
- <s:sequence> 
    <s:element minOccurs="0" maxOccurs="unbounded" name="FileMetaDataDto" nillable="true" type="tns:FileMetaDataDto" /> 
    </s:sequence> 
    </s:complexType> 
- <s:complexType name="FileMetaDataDto"> 
- <s:sequence> 
    <s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" /> 
    <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="Title" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="ContentType" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="Icon" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="ModifiedBy" type="s:string" /> 
    <s:element minOccurs="1" maxOccurs="1" name="ModifiedDateTime" type="s:dateTime" /> 
    <s:element minOccurs="1" maxOccurs="1" name="FileSizeBytes" type="s:int" /> 
    <s:element minOccurs="0" maxOccurs="1" name="Url" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="RelativeFolderPath" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="DisplayVersion" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="Version" type="s:string" /> 
    <s:element minOccurs="0" maxOccurs="1" name="CustomFields" type="tns:ArrayOfMetaDataValueDto" /> 
    <s:element minOccurs="0" maxOccurs="1" name="CheckoutBy" type="s:string" /> 
    </s:sequence> 
    </s:complexType> 
+1

http://msdn.microsoft.com/en-us/magazine/cc163569.aspx Questo articolo può darti un'idea del motivo per cui le tue modifiche hanno risolto il tuo problema. Fornisce differenze di base tra diversi serializzatori. Tuttavia, la tua risposta mi ha dato alcuni spunti per approfondire lo stesso problema che sto affrontando. – Learner

7

Sei sicuro che il tuo servizio web sia implementato correttamente nell'ambiente che NON funziona. Sembra che il tipo non sia aggiornato.

+2

Questo era il mio problema. Ho avuto versioni non corrispondenti di una DLL distribuita in due applicazioni. – StingyJack

3

Avete questa impostazione dello spazio dei nomi? Dovrai assicurarti che questo spazio dei nomi corrisponda allo spazio dei nomi del messaggio. Se è possibile aggiornare la domanda con l'input xml e possibilmente con l'oggetto dati che sarebbe utile.

[DataContract(Namespace = "http://CompanyName.com.au/ProjectName")] 
public class CustomFields 
{ 
    // ... 
} 
1

Assicurarsi che la tabella si sta tornando dispone di uno schema. In caso contrario, quindi creare uno schema predefinito (ad esempio, aggiungere una colonna in quella tabella).

0

ho trovato la soluzione reale ... C'è un problema nell'invocare il servizio da parte del cliente .. controllare le seguenti cose.

  1. assicurarsi che tutti i [DataContract], [DataMember] attributo sono posizionati correttamente cioè assicurarsi che WCF è esente da errori

  2. Il client WCF, o web.config o qualsiasi finestra applicazione di configurazione, assicurarsi le voci di configurazione sono correttamente indicando quelle giuste .. informazioni vincolante, URL del service..etc..etc

Poi sopra problema: tempuri problema viene risolto .. non ha nulla a che fare con namespace .. anche se sei sicuro di aver vissuto con il default,

Spero che risparmi il tuo numero di ore!

0

Nel nostro caso il problema era che cambiamo il nome dello spazio dei nomi di default .

Project Configuration screen

Questa è la schermata di configurazione del progetto

Finalmente abbiamo deciso di tornare al nome originale e il problema è stato risolto.

Il problema erano in realtà i punti nello spazio dei nomi radice. Con due punti (Name.Child.Child) non funziona. Ma con uno (Name.ChidChild) funziona.

0

Nel mio caso; la mia funzione di servizio WCF utilizzava il parametro List<byte> Types e stavo ottenendo questa eccezione sul lato client. Quindi l'ho cambiato in byte[] Types, riferimento di servizio aggiornato e il problema è risolto.

Problemi correlati