2009-05-15 95 views
21

Tengo un servicio web que funciona bien en un entorno pero no en otro.Cómo resuelvo este error, "error al intentar deserializar el parámetro"

El servicio web obtiene metadatos de documentos de SharePoint, se ejecuta en un servidor donde no puedo depurar pero con el registro confirmó que el método ingresa y sale exitosamente.

¿Cuál podría ser el motivo de los errores?

El mensaje de error es,

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. 

El InnerException se

System.ServiceModel.Dispatcher.NetDispatcherFaultException fue capturado mensaje = "El formateador inició una excepción al intentar deserializar el mensaje: No fue un error al intentar deserializar el parámetro http://CompanyName.com.au/ProjectName:GetDocumentMetaDataResponse.

El mensaje InnerException fue

'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: 

Respuesta

6

tengo una solución para esto, pero no estoy seguro de la razón por la que esto sea diferente de un ambiente a otro - aunque una gran diferencia entre los dos entornos es WSS SVC Pack 1 instalado en el entorno donde el error estaba ocurriendo

Para solucionar este problema Tengo una buena pista desde este enlace - http://silverlight.net/forums/t/22787.aspx es decir, que "por favor compruebe el esquema XML de su servicio" y "la secuencia en el esquema está ordenada alfabéticamente"

Mirando el WSDL generado Noté que para la clase serializada que causaba el error, las propiedades de esta clase no estaban visibles en el wsdl.

la definición de la clase tenía emisores privados para la mayoría de las propiedades, pero no para CustomFields propiedad es decir ..

[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; } 

} 

Al retirar privado desde el colocador y volver a desplegar el servicio a continuación, mirando el WSDL de nuevo, estas propiedades ahora eran visibles y se corrigió el error original.

Así que el WSDL antes de la actualización fue

- <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> 

el WSDL después de la actualización fue

- <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 Este artículo puede darle una idea de por qué sus cambios resolvieron su problema. Da las diferencias básicas entre los diferentes serializadores. Sin embargo, su respuesta me ha dado algunas pistas para investigar más sobre el mismo problema que estoy enfrentando. – Learner

7

¿Está seguro de que su servicio web está implementado correctamente en el entorno que NO está funcionando? Parece que el tipo no está actualizado.

+2

Este fue mi problema. Tenía versiones no coincidentes de un dll desplegado en dos aplicaciones. – StingyJack

3

¿Tiene esta configuración de espacio de nombres? Deberá asegurarse de que este espacio de nombres coincida con el espacio de nombres del mensaje. Si puede actualizar su pregunta con la entrada xml y posiblemente su objeto de datos que sería útil.

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

Asegúrese de que la tabla está devolviendo tiene un esquema. De lo contrario, cree un esquema predeterminado (es decir, agregue una columna en esa tabla).

0

he encontrado la solución real ... Hay un problema en la invocación de su servicio por parte del cliente .. compruebe las siguientes cosas.

  1. asegurarse de que todos [DataContract], [DataMember] atributo se colocan adecuadamente es decir, asegurarse de WCF es libre de errores

  2. El cliente WCF, ya sea web.config o cualquier aplicación de configuración de ventana, asegúrese entradas de configuración están apuntando correctamente a las correctas .. información vinculante, url del service..etc..etc

Entonces el problema anterior: tempuri problema se resuelve .. no tiene nada que ver con el espacio de nombres .. aunque está seguro de que vivió con el valor predeterminado,

¡Espero que ahorre su número de horas!

0

En nuestro caso, el problema fue que cambiamos el nombre de raíz predeterminado nombre.

Project Configuration screen

Esta es la pantalla de configuración del proyecto

Finalmente decidimos de nuevo al nombre original y el problema se solucionó.

El problema en realidad fueron los puntos en el espacio de nombres de la raíz. Con dos puntos (Name.Child.Child) no funciona. Pero con uno (Name.ChidChild) funciona.

0

En mi caso; mi función de servicio WCF estaba usando el parámetro List<byte> Types y estaba obteniendo esta excepción en el lado del cliente. Luego lo cambié a byte[] Types, la referencia de servicio actualizada y el problema está resuelto.

Cuestiones relacionadas