Почему я получаю System.InvalidOperationException от вызова WSDL, но не от того же вызова другому сервису? - PullRequest
14 голосов
/ 16 декабря 2009

Я создал сервис для получения подробной информации о стране разных клиентов, но при размещении сервиса я получаю это исключение. Я использую базовую http-привязку.

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is:
System.InvalidOperationException: An exception was thrown in a call to a 
WSDL export extension:   
  System.ServiceModel.Description.DataContractSerializerOperationBehavior
  contract: http://tempuri.org/:IReferenceDataService ----> 
     System.Runtime.Serialization.InvalidDataContractException: 
     Type 'Pariwaar.BusinessObject.CountryBO' cannot be serialized. 
     Consider marking it with the DataContractAttribute attribute, 
     and marking all of its members you want serialized with the 
     DataMemberAttribute attribute. See the Microsoft .NET Framework 
     documentation for other supported types.
   at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContractException(String message, Type type)
   at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type)
   at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type)
   at System.Runtime.Serialization.DataContract.GetDataContract(RuntimeTypeHandle typeHandle, Type type, SerializationMode mode)
   at System.Runtime.Serialization.DataContractSet.GetDataContract(Type clrType)
   at System.Runtime.Serialization.DataContractSet.GetItemTypeDataContract(CollectionDataContract collectionContract)
   at System.Runtime.Serialization.DataContractSet.AddCollectionDataContract(CollectionDataContract collectionDataContract)
   at System.Runtime.Serialization.DataContractSet.Add(XmlQualifiedName name, DataContract dataContract)
   at System.Runtime.Serialization.DataContractSet.Add(Type type)
   at System.Runtime.Serialization.XsdDataContractExporter.Export(Type type)
   at System.ServiceModel.Description.MessageContractExporter.ExportType(Type type, String partName, String operationName, XmlSchemaType& xsdType)
   at System.ServiceModel.Description.DataContractSerializerMessageContractExporter.ExportBody(Int32 messageIndex, Object state)
   at System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32 messageIndex, Object state)
   at System.ServiceModel.Description.MessageContractExporter.ExportMessageContract()
   at System.ServiceModel.Description.DataContractSerializerOperationBehavior.System.ServiceModel.Description.IWsdlExportExtension.ExportContract(WsdlExporter exporter, WsdlContractConversionContext contractContext)
   at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension)
   --- End of inner ExceptionDetail stack trace ---
   at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension)
   at System.ServiceModel.Description.WsdlExporter.CallExportContract(WsdlContractConversionContext contractContext)
   at System.ServiceModel.Description.WsdlExporter.ExportContract(ContractDescription contract)
   at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName)
   at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName)
   at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata()
   at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized()
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension)
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData()
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage)
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest)
   at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message)
   at SyncInvokeGet(Object , Object[] , Object[] )
   at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

У меня есть businessobject[datamember] в другом проекте. Я упомянул его здесь.

Вы можете посмотреть мой класс

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using Pariwaar.BusinessObject;
using Pariwaar.DataAccessLayer;

namespace Pariwaar.WCFServices.SVC
{
    // NOTE: If you change the class name "ReferenceDataService" here, you must also update the reference to "ReferenceDataService" in Web.config.
    public class ReferenceDataService : IReferenceDataService
    {
        ReferenceData objDAL = new ReferenceData();

        public List<CountryBO> GetCountry()
        { return objDAL.GetCountry(); }

        public List<StateBO> GetState(int CountryId)
        { return objDAL.GetState(CountryId); }

        public List<CityBO> GetCity(int StateId)
        { return objDAL.GetCity(StateId); }
    }
}

Почему это нормально работает с другой службой WCF, но выдает ошибку с другой службой?

Ответы [ 3 ]

7 голосов
/ 16 декабря 2009

Ну, ошибка довольно ясна:

System.Runtime.Serialization.InvalidDataContractException: Тип 'Pariwaar.BusinessObject.CountryBO' не может быть сериализовано . Рассмотрим маркировку это с DataContractAttribute атрибут, и маркировка всех его члены, которые вы хотите сериализовать с Атрибут DataMemberAttribute. Увидеть Microsoft .NET Framework документация для других поддерживаемых типы.

Очевидно, вы используете тип данных Pariwaar.BusinessObject.CountryBO в качестве параметра или возвращаемого значения для одного из ваших методов службы WCF, но у этого класса нет атрибута [DataContract].

См. Документы MSDN по Использование контрактов данных , чтобы узнать о контрактах данных и о том, как сделать ваши объекты пригодными для использования WCF. См. Это сообщение в блоге - Основы WCF: Контракты с данными для другого взгляда на ту же тему.

Все сложные типы (например, класс) должны быть помечены [DataContract], все поля, которые вы хотите включить в ваши сообщения WCF, с помощью [DataMember]:

[DataContract]
class Pariwaar.BusinessObject.CountryBO
{
   [DataMember]
   string CountryName { get; set; }

   [DataMember]
   string CountryCurrency { get; set; }

   [DataMember]
   string CountryISOCode { get; set; }

   ........
}

Марк

4 голосов
/ 23 июля 2013

Привет, я столкнулся с той же проблемой, потому что в объекте CountryBO не было конструктора по умолчанию.

0 голосов
/ 01 июня 2014

Эта ошибка может возникать в случае, если по ошибке мы использовали тип, который не является контрактом и мог использоваться в List <> или в публичной переменной другого DataContract

HydTechie

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...