C# 返回包含WCF服务中列表成员的对象
我在Shared.DataContracts DLL中有以下类C# 返回包含WCF服务中列表成员的对象,c#,web-services,wcf,wsdl,datacontract,C#,Web Services,Wcf,Wsdl,Datacontract,我在Shared.DataContracts DLL中有以下类 [DataContract] public class TestClass { [DataMember] public int Group { get; set; } [DataMember] public List<TestClassTwo> Member { get; set; } } [DataContract] public class TestClassTwo { [DataM
[DataContract]
public class TestClass
{
[DataMember]
public int Group { get; set; }
[DataMember]
public List<TestClassTwo> Member { get; set; }
}
[DataContract]
public class TestClassTwo
{
[DataMember]
public long MessageId { get; set; }
[DataMember]
public RequestOpType ResultType { get; set; }
}
[DataContract(Name = "RequestOperationType")]
public enum RequestOpType
{
[EnumMember]
Add,
[EnumMember]
Delete,
[EnumMember]
Update,
[EnumMember]
Retrieve,
[EnumMember]
Search
}
当我尝试将以下内容作为服务引用添加到我的一个项目时,WSDL总是抛出一个错误。该项目引用了Shared.DataContracts DLL。因此,我通过勾选“在引用的程序集中重用typres”复选框来添加服务引用
我得到这个错误:
错误73自定义工具错误:无法为服务生成代码
引用“ServiceReference1”。请检查其他错误和警告
给
细节。S:\src\test\source\test\Connector\Service
References\ServiceReference1\Reference.svcmap 1元连接器
警告是:
警告68自定义工具警告:无法导入wsdl:portType详细信息:一个
运行WSDL导入扩展时引发异常:
System.ServiceModel.Description.DataContractSerializerMessageCompactImporter
错误:引用类型“Poc.Shared.DataContract.TestClass,Poc.Shared,
版本=1.0.0.0,区域性=中性,PublicKeyToken=空,带数据
命名空间中的协定名称“TestClass”
''
无法使用,因为它与导入的DataContract不匹配。需要
从引用的类型中排除此类型。XPath到错误源:
//wsdl:definitions[@targetNamespace='']/wsdl:portType[@name='IConnectorService']S:\src\source\MetaConnector\Service
References\ServiceReference1\Reference.svcmap 1元连接器
如果我从TestClass中删除List
,并用TestClassTwo
成员替换它,它就可以正常工作。看起来我的问题是因为有一张清单
我需要重新使用共享程序集中的类型,因此取消选中此选项是不适用的(这将删除错误)
编辑:我认为VisualStudio的“添加服务引用”功能在阅读的基础上有点不稳定。由于我同时控制了客户端和服务器,因此我重新分解了代码以共享合同,并使用了ChannelFactory
。
虽然我在一个单独的解决方案中使用了相同的合同,但一切似乎都很好。我感觉客户端和服务器解决方案出现了一些问题,他们正在查看Shared.DataContracts.DLL的不同版本。尝试添加新的
DataContracts
如下:
[DataContract]
public class ListTestClassTwo
{
[DataMember]
public List<TestClassTwo> Member { get; set; }
public ListTestClassTwo()
{
Member = new List<TestClassTwo>();
}
}
我认为这应该行得通
或者您可以在TestClass
上尝试KnownType
进行TestClassTwo
测试,如:
[DataContract]
[KnownType(typeof(TestClassTwo))]
public class TestClass
{
[DataMember]
public int Group { get; set; }
[DataMember]
public List<TestClassTwo> Member { get; set; }
}
[DataContract]
[KnownType(typeof(TestClass2))]
公共类TestClass
{
[数据成员]
公共int组{get;set;}
[数据成员]
公共列表成员{get;set;}
}
更新:
如果正在重用程序集请确保在使用该程序集的任何地方都引用了相同版本的程序集。每次我遇到错误时,无法导入wsdl:portType Detail
,总是与重用的程序集版本不匹配有关
上次我遇到类似的问题时,我在一些
DataContract
中添加了一些属性&它被重用了,但从引用它的地方来看,旧版本没有添加新的属性,这就是问题的原因。我已经测试过,它在我的电脑上运行良好。List没有问题。您使用的是Visual Studio还是svcutil?@DhavalPatel-当您说测试时,您的确切意思是什么?您连接到Mex端点并下载了元数据?这就是我得到错误的时候。当我将服务引用添加到我的项目中时,我已经创建了一个服务,它包含了您在问题中提到的同一个类,并且工作正常。我刚刚在一个全新的解决方案中做了同样的工作,很好。我的两个解决方案都有问题。@科幻小说,更新的答案,请确保重复使用相同版本的程序集。
[DataContract]
public class TestClass
{
[DataMember]
public int Group { get; set; }
[DataMember]
public ListTestClassTwo ListOfMembers { get; set; }
}
[DataContract]
[KnownType(typeof(TestClassTwo))]
public class TestClass
{
[DataMember]
public int Group { get; set; }
[DataMember]
public List<TestClassTwo> Member { get; set; }
}