返回在WCF服务中包含List成员的Object

时间:2014-05-15 13:00:34

标签: 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
{
   [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。

1 个答案:

答案 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;中添加了一些属性。它被重用但是从它被引用的地方得到的旧版本没有新的添加属性,这就是问题的原因。