Исключение WCF: невозможно добавить в список известных типов

Всем добрый день...

Я получаю неожиданную ошибку WCF с жалобой на «известные типы» с похожими именами, но в разных пространствах имен (см. Ошибку ниже).

... имейте в виду, что я все еще экспериментирую со всем этим.

Также…

Я уже понимаю, что природа обычных веб-сервисов Заставляет вас сглаживать иерархию объектов, но все, что я прочитал, говорит, что вам не нужно делать это с WCF… вот почему я пытаюсь это сделать.

Итак, мои вопросы…

  • В: Можно ли указать WCF НЕ ИГНОРИРОВАТЬ интервал между именами?
  • В: Мне не хватает тега? Разве теги WCF (см. Ниже) не учитывают интервалы между именами?
  • В: ДОЛЖЕН ли я сгладить иерархию объектов?

Основная ошибка…

Тип wcfFISH.StateManagement.Contractor.New нельзя добавить в список известных типов, так как другой тип wcfFISH.StateManagement.CostDivision.New с тем же именем контракта данных wcfFISH.StateManagement.Contractor: New уже присутствует.

Ошибка выглядит так…

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/:IFishData ----> System.InvalidOperationException: Type 'wcfFISH.StateManagement.Contractor.New' cannot be added to list of known types since another type 'wcfFISH.StateManagement.CostDivision.New' with the same data contract name 'wcfFISH.StateManagement.Contractor:New' is already present.
   at System.Runtime.Serialization.DataContract.CheckAndAdd(Type type, Dictionary`2 typesChecked, Dictionary`2& nameToDataContractTable)
   at System.Runtime.Serialization.DataContract.ImportKnownTypeAttributes(Type type, Dictionary`2 typesChecked, Dictionary`2& knownDataContracts)
   at System.Runtime.Serialization.DataContract.ImportKnownTypeAttributes(Type type)
   at System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.get_KnownDataContracts()
   at System.Runtime.Serialization.ClassDataContract.get_KnownDataContracts()
   at System.Runtime.Serialization.DataContractSet.AddClassDataContract(ClassDataContract classDataContract)
   at System.Runtime.Serialization.DataContractSet.Add(XmlQualifiedName name, DataContract dataContract)
   at System.Runtime.Serialization.DataContractSet.AddClassDataContract(ClassDataContract classDataContract)
   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)

Сервисный код выглядит так…

namespace wcfFISH.StateManagement
{
    [DataContract(Namespace = "wcfFISH.StateManagement")]
    [KnownType(typeof(wcfFISH.StateManagement.C1FE.Approved))]
    [KnownType(typeof(wcfFISH.StateManagement.C1FE.Denied))]
    [KnownType(typeof(wcfFISH.StateManagement.C1FE.New))]
    [KnownType(typeof(wcfFISH.StateManagement.C1FE.Pending))]
    [KnownType(typeof(wcfFISH.StateManagement.Contractor.Authenticated))]
    [KnownType(typeof(wcfFISH.StateManagement.Contractor.New))]
    [KnownType(typeof(wcfFISH.StateManagement.CostDivision.Authenticated))]
    [KnownType(typeof(wcfFISH.StateManagement.CostDivision.New))]
    [KnownType(typeof(wcfFISH.StateManagement.ReportingPeriod.Closed))]
    [KnownType(typeof(wcfFISH.StateManagement.ReportingPeriod.Open))]
    public abstract class ObjectState
    {
        #region CONSTRUCTORS

        protected ObjectState()
        { }

        #endregion

        #region PROPERTIES & FIELDS

        #endregion

        #region EVENTS
        #endregion

        #region METHODS    
        #endregion
    }
}

Дополнительное примечание…

Еще одна причина, по которой я смущен, - это то, что исходные объявления, перечисленные ниже, НИКОГДА не вызывали проблем ... и все работало нормально! Это произошло только когда я ДОБАВИЛ CostDivision!

[KnownType(typeof(wcfFISH.StateManagement.C1FE.New))]
[KnownType(typeof(wcfFISH.StateManagement.Contractor.New))]

На случай, если я что-то не понимаю…

Насколько я понимаю, WCF должен понимать разницу между следующими классами:

[KnownType(typeof(wcfFISH.StateManagement.Contractor.Authenticated))]
[KnownType(typeof(wcfFISH.StateManagement.Contractor.New))]
[KnownType(typeof(wcfFISH.StateManagement.CostDivision.Authenticated))]
[KnownType(typeof(wcfFISH.StateManagement.CostDivision.New))]

Если НЕ понимает…

Думаю, мой единственный вариант - сгладить иерархию ВСЕГО, чтобы:

wcfFISH.StateManagement.Authenticated
wcfFISH.StateManagement.New

… Это мой единственный вариант? (надеюсь нет!)


person Prisoner ZERO    schedule 19.04.2010    source источник


Ответы (1)


Мои экстрасенсорные способности говорят мне, что ваше объявление wcfFISH.StateManagement.CostDivision.New было скопировано / вставлено из wcfFISH.StateManagement.Contractor.New, и пока вы меняли имя класса, вы не меняли его атрибут DataContract, чтобы он соответствовал.

person Task    schedule 19.04.2010
comment
Нет проблем, рад, что смог помочь. Давайте послушаем его для экстрасенсорных способностей! 8) - person Task; 19.04.2010
comment
в настоящее время; Если бы только мы не использовали инструменты автоматического создания файлов xsd, это был бы действительно хороший совет. - person Christian; 18.12.2019