2009-05-15 34 views
21

Tôi có dịch vụ web hoạt động tốt trong một môi trường nhưng không hoạt động trong một môi trường khác.Làm cách nào để giải quyết lỗi này, "lỗi khi cố gắng tham số deserialize"

Dịch vụ web nhận dữ liệu meta tài liệu từ SharePoint, nó chạy trên máy chủ mà tôi không thể gỡ lỗi nhưng với ghi nhật ký, tôi xác nhận rằng phương thức nhập và thoát thành công.

Điều gì có thể là nguyên nhân gây ra lỗi?

Các thông báo lỗi là,

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. 

Các InnerException được

System.ServiceModel.Dispatcher.NetDispatcherFaultException bị bắt nhắn = "Các định dạng ném một ngoại lệ khi cố gắng deserialize thông điệp: Có đã xảy ra lỗi khi cố gắng deserialize tham số http://CompanyName.com.au/ProjectName:GetDocumentMetaDataResponse.

Thông báo InnerException là

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

Trả lời

6

tôi có một giải pháp cho việc này nhưng không chắc chắn về lý do tại sao điều này sẽ khác nhau từ một môi trường để người kia - mặc dù một sự khác biệt lớn giữa hai môi trường là WSS svc gói 1 đã được cài đặt trên môi trường nơi lỗi đã xảy ra.

Để khắc phục vấn đề này, tôi có một đầu mối tốt từ liên kết này - http://silverlight.net/forums/t/22787.aspx tức là để "xin vui lòng kiểm tra Schema Xml dịch vụ của bạn" và "chuỗi trong lược đồ được sắp xếp theo thứ tự abc"

Nhìn vào wsdl tạo Tôi nhận thấy rằng đối với lớp serialized đã gây ra lỗi, các thuộc tính của lớp này không được hiển thị trong wsdl.

Định nghĩa của lớp có setters tin cho hầu hết các tài sản, nhưng không phải cho bất động sản tức là 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; } 

} 

On loại bỏ tin từ setter và redeploying dịch vụ sau đó nhìn vào wsdl một lần nữa, các thuộc tính này hiện đã hiển thị và lỗi gốc đã được sửa.

Vì vậy, các wsdl trước khi cập nhật là

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

Các wsdl sau khi cập nhật là

- <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 Bài viết này có thể cho bạn biết tại sao các thay đổi của bạn giải quyết được vấn đề của bạn. Nó cung cấp cho sự khác biệt cơ bản giữa các serializers khác nhau. Tuy nhiên, câu trả lời của bạn đã cho tôi một số gợi ý để điều tra thêm về vấn đề tương tự mà tôi đang gặp phải. – Learner

7

Bạn có chắc chắn dịch vụ web của mình được triển khai chính xác với môi trường KHÔNG hoạt động. Có vẻ như loại đã lỗi thời.

+2

Đây là vấn đề của tôi. Tôi đã có phiên bản không phù hợp của một dll triển khai trong hai ứng dụng. – StingyJack

3

Bạn có thiết lập không gian tên này không? Bạn sẽ phải đảm bảo rằng không gian tên này khớp với không gian tên tin nhắn. Nếu bạn có thể cập nhật câu hỏi của mình với đầu vào xml và có thể đối tượng dữ liệu của bạn sẽ hữu ích.

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

Hãy chắc chắn rằng bảng bạn đang trở về có một giản đồ. Nếu không, hãy tạo một lược đồ mặc định (tức là thêm một cột trong bảng đó).

0

tôi tìm thấy giải pháp thực tế ... có một vấn đề trong cách gọi dịch vụ của bạn từ máy khách .. kiểm tra những điều sau đây.

  1. đảm bảo tất cả [DataContract], [DataMember] thuộc tính được đặt đúng tức là đảm bảo WCF là lỗi

  2. Các WCF client, hoặc web.config hoặc bất kỳ cửa sổ ứng dụng cấu hình, hãy chắc chắn mục cấu hình được đúng trỏ đến những cái đúng .. thông tin ràng buộc, url của service..etc..etc

Sau đó, trên vấn đề: tempuri vấn đề đã được giải quyết .. nó không có gì để làm với namespace .. mặc dù bạn chắc chắn bạn đã sống với mặc định,

Hy vọng nó sẽ tiết kiệm số giờ của bạn!

0

Trong trường hợp của chúng tôi, vấn đề là chúng tôi thay đổi tên mặc định là tên gốc gốc tên.

Project Configuration screen

Đây là màn hình Cấu hình dự án

Cuối cùng chúng tôi quyết định trở lại với tên ban đầu và vấn đề đã được giải quyết.

Sự cố thực sự là các dấu chấm trong không gian tên Gốc. Với hai dấu chấm (Name.Child.Child) nó không hoạt động. Nhưng với một (Name.ChidChild) hoạt động.

0

Trong trường hợp của tôi; chức năng dịch vụ WCF của tôi đã sử dụng thông số List<byte> Types và tôi đã nhận được ngoại lệ này ở phía máy khách. Sau đó, tôi thay đổi nó thành byte[] Types, tài liệu tham khảo dịch vụ cập nhật và vấn đề được giải quyết.

Các vấn đề liên quan