代码之家  ›  专栏  ›  技术社区  ›  ajeh

如何将包含自定义列表的自定义类对象传递给web服务?

  •  0
  • ajeh  · 技术社区  · 13 年前

    我必须在VS2008C#中实现一个简单的传统web服务,它将接收一个Order类对象,其中包含一个Product类对象列表。当我在客户端上创建Order类对象的实例时,问题就出现了。它是在代理中声明的,不包含任何方法,因此我没有机会添加Products,因为List of Products现在只是一个System.Array。

    一种行之有效的方法是在客户端手动序列化为XML,并在web服务中反序列化。通过这种方式,我将使用相同的类声明,我将其隔离到web服务和客户端应用程序之间共享的DLL中。然而,有人告诉我,可以避免使用共享DLL和手动序列化替代品,但我只是不明白如何,即我需要如何声明/定义Order类,以及在哪里才能在客户端上有方法?

    目前,类在共享DLL中定义如下:

    namespace MyNS
    {
        [Serializable]
        public class ProductInfo { 
            public Int32 ProductID;
            public Int32 Quantity;
            public decimal CurrPrice;
    
            public VE_ProductInfo() { 
                ProductID = 0;
                Quantity = 0;
                CPrice = 0;
            }
    
            public ProductInfo(Int32 pId, Int32 quant, decimal cprice)
            {
                ProductID = pId;
                Quantity = quant;
                CPrice = cprice;
            }
        }
    
        [Serializable]
        public class OrderInfo
        {
            public Int32 CustomerId = 0;
    
            public OrderInfo () {
                Items = new List<ProductInfo>();
            }
    
            [XmlArray]
            public List<ProductInfo> Items {get; set;}
    
            public string SpecialInstructions;
    
            public void AddProduct(ProductInfo pi)
            {
                Items.Add(pi);
            }
        }
    }
    

    然后,该类在web服务方法中使用,如下所示:

    public bool CreateOrder(OrderInfo Order) {
        // some code
    }
    

    它从客户端调用如下:

    WebService.MyWebService s;
    
    WebService.OrderInfo o = new WebService.OrderInfo();
    
    o.CustomerId = 1;
    o.Items.Add(new ProductInfo(2, 4));
    o.Items.Add(new ProductInfo(1, 2, 3.95m));
    
    checkBox1.Checked = s.CreateOrder(o);
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   moron4hire    13 年前

    如果为应用程序和web服务之间共享的类提供默认构造函数和字段初始值设定项,则可以将这些类放在两个项目都引用的单独库项目中。当您将web服务引用添加到应用程序时,它将生成一些与对象的数据“形状”匹配的代理类,即sans方法。您可以删除这些类(我不记得它们的确切位置),并向web服务代理类文件本身添加一个using语句来导入您的共享类,它们就会正常工作。

        2
  •  1
  •   Jason Steele    13 年前

    如果您的web服务是WCF服务,并且您通过添加web引用为其创建了代理,那么您应该能够通过在Visual Studio中编辑引用来更改它。右键单击它并选择“配置服务引用”,然后选择列表的集合类型。