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 的输出
我有一个继承自 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 的输出