Исключение WCF:Не удается добавить в список известных типов
-
28-09-2019 - |
Вопрос
Всем доброго дня...
Я получаю неожиданную ошибку WCF с жалобой на “Известные типы”, которые имеют похожие имена, но в разных пространствах имен (см. Ошибку ниже).
..пожалуйста, имейте в виду, что я все еще экспериментирую со всем этим.
Также…
Я уже понимаю, что природа обычных веб-сервисов ЗАСТАВЛЯЕТ вас сглаживать иерархию объектов, но все, что я прочитал, говорит о том, что вам не обязательно делать это с WCF…вот почему я пытаюсь это сделать.
Итак, мои вопросы таковы…
- Q:Можно ли указать WCF, чтобы ОН НЕ ИГНОРИРОВАЛ интервал между именами?
- Q:Я пропустил какой-то тег?Разве теги WCF (ниже) не учитывают интервал между именами ?
- Q:Должен ли я сглаживать иерархию моего объекта ?
Основная ошибка заключается в том, что…
Тип 'wcfFISH.StateManagement.Подрядчик.Новый' не может быть добавлен в список известных типов поскольку другой тип 'wcfFISH.StateManagement.Разделение затрат.Новый" с тем же именем контракта данных "wcfFISH.StateManagement.Исполнитель: Новый" уже присутствует.
Ошибка выглядит следующим образом…
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
... это мой единственный вариант?(надеюсь, что нет!)
Решение
Мои экстрасенсорные способности подсказывают мне, что ваша декларация wcfFISH.StateManagement.Cost Division.New была скопирована / вставлена из wcfFISH.StateManagement.Contractor.Новый, и хотя вы изменили имя класса, вы не изменили атрибут DataContract в нем, чтобы он соответствовал.