【问题标题】:WCF Web Service: How to return an inherited object that is known on the clientWCF Web 服务:如何返回客户端已知的继承对象
【发布时间】:2015-02-13 07:08:17
【问题描述】:

我有一个继承自 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 服务时,即使我通过网络发送了 AddressDTO(案例 1),我也会收到一个对象 ResponseDTO。我无法转换为 AddressDTO,因为 AddressDTO 在客户端(通过 WSDL 定义)中不作为对象已知,因此具有 Address 对象列表的属性 Elements 被隐藏(或不导出/传输)给客户端。

这不可能以我尝试过的方式处理 Web 服务上的继承,还是我必须以某种方式为 WSDL 声明继承,以便客户端能够重建继承的结构,以便我可以转换 ResponseDTO在一天结束时发送到 AddressDTO?

非常感谢您提前提供的答案/想法。

【问题讨论】:

  • WCF 'KnownType' 会有所帮助

标签: c# web-services wcf inheritance wsdl


【解决方案1】:

这是一个已知类型的小演示..
以下服务在 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 WcfKnownTypeStackOverFlow
{
    [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 WcfKnownTypeStackOverFlow
{
    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 的输出

【讨论】:

    【解决方案2】:

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

    下面link到代码项目会更详细的解释这个话题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-29
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 2011-03-13
      • 2016-05-19
      • 1970-01-01
      相关资源
      最近更新 更多