我在Shared.DataContracts DLL中有以下类
[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
}
我的服务合同如下:
[ServiceContract]
public interface IConnectorService
{
[OperationContract]
void PustRequestToWorkBuffer(TestClass test);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class ConnectorService : IConnectorService
{
public void PustRequestToWorkBuffer(TestClass test)
{
return;
}
}
当我尝试将以下内容作为服务引用添加到我的一个项目时,我总是会遇到WSDL抛出的错误。该项目引用了Shared.DataContracts DLL。因此,我通过勾选“在引用的程序集中重用typres”复选框来添加服务引用。
我收到此错误:
错误73自定义工具错误:无法为服务生成代码 引用'ServiceReference1'。请检查其他错误和警告 消息 细节。 S:\ SRC \测试\源\测试\连接器\服务 References \ ServiceReference1 \ Reference.svcmap 1 1 MetaConnector
警告是:
警告68自定义工具警告:无法导入wsdl:portType详细信息:An 运行WSDL导入扩展时抛出异常: System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:引用类型'Poc.Shared.DataContract.TestClass,Poc.Shared, 版本= 1.0.0.0,Culture = neutral,PublicKeyToken = null'包含数据 命名空间中的合同名称“TestClass” 'http://schemas.datacontract.org/2004/07/Poc.Shared.DataContract' 无法使用,因为它与导入的DataContract不匹配。需要 从引用的类型中排除此类型。 XPath到错误源: // wsdl:definitions [@targetNamespace ='http://tempuri.org/'] / wsdl:portType [@ name ='IConnectorService'] S:\ src \ source \ MetaConnector \ Service References \ ServiceReference1 \ Reference.svcmap 1 1 MetaConnector
如果我从TestClass中删除List<TestClassTwo>
并将其替换为TestClassTwo
成员,则可以正常使用。看起来有一个列表是我的问题的原因。
我需要重新使用共享程序集中的类型,因此取消选中此选项不适用(但会删除错误)。
编辑:我认为视觉工作室的“添加服务参考”功能在阅读时有点不稳定。由于我控制了客户端和服务器,因此我重新考虑了我的代码以共享合同并使用ChannelFactory
代替。
虽然我确实在单独的解决方案中使用了相同的合同,但一切似乎都没问题。我有一种感觉,客户端和服务器解决方案存在一些问题,他们正在查看不同版本的Shared.DataContracts.DLL。
答案 0 :(得分:0)
尝试添加新的DataContract
,如:
[DataContract]
public class ListTestClassTwo
{
[DataMember]
public List<TestClassTwo> Member { get; set; }
public ListTestClassTwo()
{
Member = new List<TestClassTwo>();
}
}
然后在TestClass中定义它,如:
[DataContract]
public class TestClass
{
[DataMember]
public int Group { get; set; }
[DataMember]
public ListTestClassTwo ListOfMembers { get; set; }
}
我认为这应该有用。
或者您可以尝试KnownType
TestClassTwo
而不是TestClass
,例如:
[DataContract]
[KnownType(typeof(TestClassTwo))]
public class TestClass
{
[DataMember]
public int Group { get; set; }
[DataMember]
public List<TestClassTwo> Member { get; set; }
}
<强>更新强>
如果您重新使用程序集,请确保在任何地方引用相同版本的程序集。每次我遇到Cannot import wsdl:portType Detail
的错误时,它总是与重复使用的汇编版本不匹配有关。
上次我遇到类似的问题时,我在某些DataContract
&amp;中添加了一些属性。它被重用但是从它被引用的地方得到的旧版本没有新的添加属性,这就是问题的原因。