使用具有复杂数据类型的WCF服务

时间:2010-01-12 19:58:12

标签: c# asp.net-mvc wcf service

我正在尝试使用一个导航属性IEnumerable<>传递DTO在它内部,当我传递一个没有子列表的对象时它运行良好,但是,当我传递带有子孙的对象时,WCF服务没有响应并且没有给我任何错误。我必须具体使用这种类型的对象吗?

这是我的数据合同

    [ServiceContract]
        public interface IProdutoService
        {
            [OperationContract]
            CategoriaResponse GetCategoria(CategoriaRequest request);

            [OperationContract]
            ProdutoResponse GetProduto(ProdutoRequest request);

            [OperationContract]
            CategoriaResponse ManageCategoria(CategoriaRequest request);

            [OperationContract]
            ProdutoResponse ManageProduto(ProdutoRequest request);
        }


//and then my DTO Class

 public class ProdutoDto
    {
        #region Primitive Properties
        [DataMember]
        public Int32 Codigo { get; set; }

        [DataMember]
        public Int32 CodigoCategoria { get; set; }

        [DataMember]
        public String Descricao { get; set; }

        [DataMember]
        public Decimal? Preco { get; set; }
        #endregion


        #region Navigation Properties
        [DataMember]
        public CategoriaDto Categoria { get; set; }

        [DataMember]
        public VendaDto[] Vendas { get; set; }
        #endregion
    }

//我的服务配置如下所示:

<services>
  <service behaviorConfiguration="behaviorAction" name="Uniarchitecture.ProdutoService.ServiceImplementations.ProdutoService">
    <endpoint binding="wsHttpBinding" bindingConfiguration="bindingAction" contract="Uniarchitecture.ProdutoService.ServiceContracts.IProdutoService">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="behaviorAction">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>


<bindings>
  <wsHttpBinding>
    <binding name="bindingAction" transactionFlow="false" receiveTimeout="00:30:00" >
      <reliableSession enabled="true"/>
    </binding>
  </wsHttpBinding>
</bindings>

2 个答案:

答案 0 :(得分:0)

您的子对象可能未标记为可序列化。

它看起来好像你缺少DataContract属性。

从下面的评论中看起来你有一些不可序列化的对象。浏览您使用的所有对象,并使用serializable或data contract属性标记它们。

答案 1 :(得分:0)

您必须使用合同感知的循环引用。