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

C# 如何将包含自定义列表的自定义类的对象传递给web服务?,c#,web-services,C#,Web Services,我必须在VS2008 C中实现一个简单的传统web服务,它将接收一个Order类对象,其中包含产品类对象的列表。当我在客户机上创建Order类对象的实例时,问题就出现了。它是在代理中声明的,不包含任何方法,因此我没有机会添加产品,因为产品列表现在只是一个System.Array 一种工作良好的方法是在客户机上手动序列化为XML,并在web服务中反序列化。通过这种方式,我将使用我隔离到web服务和客户端应用程序之间共享的DLL中的同一个类声明。然而,有人告诉我,可以避免使用共享DLL和手动序列化a

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

一种工作良好的方法是在客户机上手动序列化为XML,并在web服务中反序列化。通过这种方式,我将使用我隔离到web服务和客户端应用程序之间共享的DLL中的同一个类声明。然而,有人告诉我,可以避免使用共享DLL和手动序列化althogether,但我不明白如何,也就是说,我需要如何声明/定义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);
        }
    }
}
从客户处调用如下:

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);

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

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

您可能指的是Reference.cs,其中声明/定义了代理类。我只是从那里删除声明,是吗,这么简单?8是的,只是不要删除为能够调用web方法而创建的代理类。这是一个真正的天才解决方案!工作起来很有魅力。我刚刚注释掉了Reference.cs中的订单和产品类。这些类已经是可序列化的,并且具有默认构造函数,所以它可以正常工作。由于你是新来的,我还不能恭维你,但请放心,我会尽快告诉你的!非常感谢。很高兴我能帮上忙:我真的不得不这么做一次,哦。。。6或7年前。最后一个问题:每次更新web Reference时,我是否必须从Reference.cs中注释掉/删除类?我想是的……不,这是VS2008中的传统web服务。现在我意识到我应该提到这一点,谢谢你指出!
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);