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