代码之家  ›  专栏  ›  技术社区  ›  Prisoner ZERO

WCF异常:无法添加到已知类型的列表中

  •  0
  • Prisoner ZERO  · 技术社区  · 16 年前

    大家好…

    i_m收到意外的WCF错误,抱怨_已知类型_具有相似的名称,但在不同的名称空间中(请参见下面的错误)。

    …请记住,我还在试验这些。

    也就是

    我已经了解了常规Web服务的本质,它迫使您扁平化对象层次结构,但我读过的所有内容都表明,您不必使用wcf__来实现这一点,这就是我尝试实现这一点的原因。

    所以我的问题是

    • 问:有没有可能告诉WCF不要忽略 名称间距?
    • 问:我是不是找不到标签了?世界自然基金会 标签(下面)将名称间距 帐户?
    • 问:我需要把我的物体压平吗? 等级制度?

    基本误差是_

    类型 'wcfish.statemanagement.contractor.new' 无法添加到已知类型的列表中 因为另一种类型 'wcfish.statemanagement.costdivision.new' 具有相同数据合同名称 'wcfish.statemanagement.contractor:新建' 已经存在。

    错误看起来像_

    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
    

    这是我唯一的选择吗?(希望不是!)

    1 回复  |  直到 16 年前
        1
  •  7
  •   Task    16 年前

    我的灵力告诉我,你的wcfish.statemanagement.costdivision.new声明是从wcfish.statemanagement.contractor.new复制/粘贴的,当你更改类名时,你没有更改它的datacontract属性来匹配。

    推荐文章