2009-05-15 2 views
21

У меня есть веб-служба, которая отлично работает в одной среде, но не в другой.Как решить эту ошибку, «ошибка при попытке десериализации параметра»

Веб-служба получает метаданные документа из SharePoint, она работает на сервере, где я не могу отлаживать, но с протоколированием. Я подтвердил, что метод входит и успешно завершается.

В чем причина ошибок?

Сообщение об ошибке,

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. 

InnerException был

System.ServiceModel.Dispatcher.NetDispatcherFaultException был пойман Message = "Форматировщик бросил исключение при попытке десериализации сообщений: Там была ошибка при попытке десериализации параметра http://CompanyName.com.au/ProjectName:GetDocumentMetaDataResponse.

Сообщение InnerException было

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

ответ

6

У меня есть решение для этого, но не уверен, что по причине, почему это будет отличаться от одной среды в другую - хотя одна большая разница между этими двумя средами заключается WSS SVC пакет 1 был установлен на окружающую среду, где ошибка произошла.

Чтобы устранить эту проблему, я получил хороший ключ от этой ссылке - http://silverlight.net/forums/t/22787.aspx то есть «Пожалуйста, проверьте Xml схема вашей службы» и «последовательность в схеме отсортированный по алфавиту»

Глядя на WSDL генерируемой Я заметил, что для сериализованного класса, который вызывал ошибку, свойства этого класса не были видны в wsdl.

Определение класса имели частные сеттеры для большинства свойств, но не для CustomFields собственности, т.е. ..

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

} 

На удалении от частных сеттер и передислокации сервиса, то глядя на WSDL снова, эти свойства были теперь видны, и исходная ошибка была исправлена.

Так WSDL перед обновлением был

- <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, после того, как обновление было

- <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 Эта статья может дать вам представление о том, почему ваши изменения решили вашу проблему. Это дает принципиальные различия между различными сериализаторами. Тем не менее, ваш ответ дал мне несколько советов для дальнейшего изучения той же проблемы, с которой я столкнулся. – Learner

7

Вы уверены, что ваш веб-сервис правильно установлен на окружающую среду, которая НЕ работает. Похоже, что тип устарел.

+2

Это была моя проблема. У меня были несогласованные версии dll, развернутых в двух приложениях. – StingyJack

3

У вас есть эта установка пространства имен? Вы должны убедиться, что это пространство имен совпадает с пространством имен сообщений. Если вы можете обновить свой вопрос с помощью ввода xml и, возможно, вашего объекта данных, который был бы полезен.

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

Убедитесь, что стол вы возвращаете имеет схему. Если нет, то создайте схему по умолчанию (т. Е. Добавьте столбец в эту таблицу).

8

Это происходит потому, что веб-сервис основан на использовании XmlSerializer для преобразования WSDL среди других вещей в XML, который не поддерживает свойства смешанного режима, как это:

public string strThing { get; private set; } 

См: http://msdn.microsoft.com/en-us/library/ms978420.aspx

Дополнительная информация: http://www.geekscrapbook.com/2010/03/06/serializing-data-with-system-runtime-serialization-datacontractserializer/

0

Я нашел реальное решение ... Существует проблема в вызове вашей службы от клиента .. проверьте следующие вещи.

  1. Убедитесь, что все [DataContract], [DataMember] атрибут размещены правильно то убедитесь, что WCF является безошибочным

  2. ФОС клиент, либо web.config или любое окно приложения конфигурации, убедитесь, записи конфигурации правильно указывая на правильные .. связывание информации, URL из service..etc..etc

Тогда над проблемой: tempuri проблема решена .. это не имеет ничего общего с пространством именами .. хотя вы уверены, что живете с дефолтом,

Надеюсь, это сэкономит ваше количество часов!

0

В нашем случае проблема заключалась в том, что мы меняем значение корневого пространства имен.

Project Configuration screen

Это экран конфигурации проекта

Мы, наконец, решили вернуться к первоначальному названию и проблема была решена.

Проблема была в точках в пространстве имен Root. С двумя точками (Name.Child.Child) он не работает. Но с одним (Name.ChidChild) работает.

0

В моем случае; моя функция службы WCF использовала параметр List<byte> Types, и я получал это исключение на стороне клиента. Затем я изменил его на byte[] Types, обновленная справочная служба и проблема решена.

Смежные вопросы