WCF Web 服务:如何 return 客户端已知的继承对象

WCF Web Service: How to return an inherited object that is known on the client

我有一个继承自 ResponseDTO 的对象 AddressDTO。

[DataContract]
public class ResponseDTO
{
   [DataMember]
   public string ID {get; set;}
}
[DataContract]    
public class AddressDTO : ResponseDTO
{
   [DataMember]
   public List<Address> Elements {get; set;}
}

我想要一种通用 Web 服务,它接收 RequestDTO 作为输入参数并创建(取决于 RequestDTO 中的 RequestType)AddressDTO 或 ResponseDTO。

public ResponseDTO GetDataFromWebService(RequestDTO request)
{
   ...
   ResponseDTO response = null;
   switch(request.Request)
   {
      case RequestType.Case1:
         response = new AddressDTO();
         break;
      case RequestType.Case2:
      default:
         response = new ResponseDTO();
         break;
   }
   ...
   return response;
}

在客户端,当尝试使用此 Web 服务时,我将收到一个对象 ResponseDTO,即使我已经通过网络发送了一个 AddressDTO(案例 1)。我无法转换为 AddressDTO,因为客户端(通过 WSDL 定义)不知道 AddressDTO 作为对象,因此带有地址对象列表的 属性 元素被隐藏(或不 exported/transferred)到客户.

这是否无法按照我尝试过的方式处理 Web 服务上的继承,或者我是否必须以某种方式为 WSDL 声明继承,以便客户端能够重建继承的结构,以便我可以转换在一天结束时将 ResponseDTO 转换为 AddressDTO?

非常感谢您提前answers/ideas。

感谢 vikrantx 提供 KnownType 的提示。 - 我不知道!

以下 link 代码项目将更详细地解释该主题。

我想,这将解决我的问题,即使我目前无法尝试。

这是一个已知类型的小演示..
以下服务已在 WCF 测试客户端上进行测试。
在 wcf 测试客户端中,您将获得不同的输入输出(Request1,Request2)。

IService1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfKnownTypeWhosebug
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        ResponseDTO GetDataFromWebService(RequestDTO request);
    }

    [DataContract]
    [KnownType(typeof(AddressDTO))]
    public class ResponseDTO
    {
        [DataMember]
        public string ID { get; set; }
    }

    [DataContract]
    public class AddressDTO : ResponseDTO
    {
        [DataMember]
        public List<Address> Elements { get; set; }
    }

    [DataContract]
    public class Address
    {
        [DataMember]
        public string Street { get; set; }

        [DataMember]
        public string City { get; set; }
    }

    [DataContract]
    public enum RequestDTO
    {
        [EnumMember]
        Request1,

        [EnumMember]
        Request2
    }
}

Service1.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfKnownTypeWhosebug
{
    public class Service1 : IService1
    {
     public ResponseDTO GetDataFromWebService(RequestDTO request)
     {
           ResponseDTO response = null;
           switch(request)
           {
               case RequestDTO.Request1:
                   {
                       AddressDTO addrDto = new AddressDTO();
                       Address addr = new Address();
                       addrDto.Elements = new List<Address>() 
                       { 
                           new Address                          
                           { 
                               City ="mycity", 
                               Street="mystreet"}, 
                           new Address
                           {
                               City="yourcity", 
                               Street="yourcity"}};

                       response =  (ResponseDTO)addrDto;
                       break;
                   }
              case RequestDTO.Request2:
               default:
                  {
                     response = new ResponseDTO();
                     response.ID = "responseDto";
                     break;
                 }
           }
           return response;
        }
    }
}

请求 1 的输出

Request2 的输出