使用通用对象从Web服务方法返回数据?

时间:2010-11-24 14:19:55

标签: c# generics serialization asmx

我有一个ASMX webservice,其中包含许多将返回XML的方法。

服务返回各种不同的对象,我创建了一个包装器对象,其中包含有关请求的信息,例如:

[Serializable]
[XmlRoot("response")]
public class DtoWrapper<T>
{
    [XmlElement("error")]
    public bool Error { get; set; }

    [XmlElement("error_message")]
    public string ErrorMessage { get; set; }

    [XmlElement("success")]
    public bool Success { get; set; }

    [XmlElement("friendly_message")]
    public string FriendlyMessage { get; set; }

    [XmlArray("result")]
    [XmlArrayItem("item")]
    public List<T> Payload { get; set; }
}

现在这个工作正常,直到我用不同的类型定义了我的第二个方法。然后,当我尝试加载ASMX测试页时,我收到此错误

  

名称空间“http://tempuri.org/”中的顶级XML元素“响应”   引用不同的类型   MyProject.Web.webservices.DtoWrapper 1[MyProject.BusinessLogic.ClassA] and MyProject.Web.webservices.DtoWrapper 1 [MyProject.BusinessLogic.ClassB]。   使用XML属性指定另一个   元素的XML名称或命名空间   或类型。

我尝试使用[XmlType(Namespace="com.temp.A")][XmlType(Namespace="com.temp.B")]标记我的对象,但似乎没有帮助。

有什么想法吗?我是否必须为我想要使用的每种类型创建一个包装器对象?

编辑:我意识到这不是问题的类型参数。事实上,在类上指定了[XmlRoot]标记。序列化程序将它们视为两种类型,但它们在同一名称空间中具有相同的根元素。

1 个答案:

答案 0 :(得分:0)

你不能这样做。 XML没有泛型的概念,XML Schema或SOAP也没有。就XML Schema而言,如果它具有相同的元素名称和相同的命名空间,那么它就是一样的。

您不能拥有通用Web服务,因为这些概念不存在。