استثناء WCF: لا يمكن إضافة إلى قائمة الأنواع المعروفة

StackOverflow https://stackoverflow.com/questions/2668006

سؤال

يوم جيد للجميع...

أحصل على خطأ في WCF غير متوقع يشكو من "أنواع معروفة" تم تسميتها بالمثل ، ولكن في مساحات أسماء مختلفة (انظر الخطأ أدناه).

... من فضلك ضع في اعتبارك أنني ما زلت أجرب كل هذا.

ايضا…

أنا أفهم بالفعل طبيعة خدمات الويب العادية التي تجبرك على تسطيح التسلسل الهرمي للكائن ، لكن كل ما قرأته يقول إنه لا يتعين عليك القيام بذلك مع WCF ... وهذا هو السبب في أنني أحاول ذلك.

لذلك أسئلتي ...

  • س: هل من الممكن إخبار WCF بعدم تجاهل المساحة؟
  • س: هل أفتقد علامة؟ ألا تأخذ علامات WCF (أدناه) تباعد الاسم في الاعتبار؟
  • س: هل يجب علي تسطيح تسطيح التسلسل الهرمي الخاص بي؟

الخطأ الأساسي هو ...

اكتب "wcffish.statemanagement.contractor.new" لا يمكن إضافة إلى قائمة الأنواع المعروفة منذ نوع آخر "wcffish.statemanagement.costdivision.new" بنفس اسم عقد البيانات "wcffish.statemanage.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

... هل هذا خياري الوحيد؟ (نأمل ألا!)

هل كانت مفيدة؟

المحلول

تخبرني القوى النفسية الخاصة بي أن إعلانك عن wcffish.statemanagement.costdivision.new تم لصقه/لصقه من wcffish.statemanagement.contractor.new ، وبينما قمت بتغيير اسم الفصل ، لم تقم بتغيير سمة التعاقد على DataContract.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top