【发布时间】:2010-04-19 14:07:35
【问题描述】:
大家好...
我收到一个意外的 WCF 错误,抱怨“已知类型”的名称相似,但名称空间不同(请参阅下面的错误)。
...请记住,我仍在尝试所有这些。
还有……
我已经了解常规 Web 服务的性质会迫使您扁平化对象层次结构,但我所读到的所有内容都表明您不必使用 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
……这是我唯一的选择吗? (希望不会!)
【问题讨论】:
标签: wcf invalidoperationexception known-types