代码之家  ›  专栏  ›  技术社区  ›  Rob Stevenson-Leggett

使用通用对象从WebService方法返回数据?

  •  2
  • Rob Stevenson-Leggett  · 技术社区  · 14 年前

    我有一个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元素“response” 引用不同类型 myproject.web.web服务.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]标记。序列化程序将它们视为2个类型,但它们在同一命名空间中具有相同的根元素。

    1 回复  |  直到 14 年前
        1
  •  0
  •   John Saunders    14 年前

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

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