0

我必须在 VS2008 C# 中实现一个简单的常规 Web 服务,它将接收一个 Order 类对象,其中包含一个 Product 类对象列表。当我在客户端上创建 Order 类对象的实例时,就会出现问题。它在代理中声明并且不包含任何方法,因此我没有机会添加产品,因为产品列表现在只是一个 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);
4

2 回答 2

1

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

于 2013-08-27T15:27:31.953 回答
1

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

于 2013-08-27T15:30:23.080 回答