2013-08-27 31 views
0

我必須在VS2008 C#中實現一個簡單的常規Web服務,它將接收一個Order類對象,其中包含一個Product類對象列表。當我在客戶端上創建Order類對象的實例時出現問題。它在代理中聲明並且不包含任何方法,因此我沒有機會添加產品,因爲產品列表現在只是一個System.Array。如何將包含自定義列表的自定義類的對象傳遞給Web服務?

工作正常的一種方法是在客戶端上手動序列化爲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); 

回答

1

如果您爲應用程序和Web服務之間共享的類提供默認構造函數和字段初始值設定項,則可以將這些類放入兩個項目都引用的單獨的庫項目中。當您將Web服務引用添加到應用程序時,它將生成一些與您的對象的數據「形狀」匹配的代理類,它們不會使用方法。您可以刪除這些類(我不記得它們確切位於何處),並向Web服務代理類文件本身添加using語句以導入您的共享類,它們將正常工作。

+0

您可能指的是聲明/定義代理類的Reference.cs。我只是從那裏刪除聲明,是這麼簡單嗎? 8() – ajeh

+0

是的,只是不要刪除創建的代理類,以便能夠調用Web方法。 – moron4hire

+0

這是一個真正的天才解決方案!奇蹟般有效。我剛剛從Reference.cs中評論了Order和Product類。這些類已經可以序列化,並且具有默認的構造函數,所以它就可以工作。由於在這裏新來過,我還不能鼓勵你,但請放心,我會盡快做到!非常感謝。 – ajeh

1

如果您的Web服務是WCF服務器,並且您爲其創建了代理服務器添加一個Web引用,您應該能夠通過在Visual Studio中編輯引用來更改它。右鍵點擊它並選擇「配置服務參考」,然後選擇一個集合類型的列表。

+0

不,這是VS 2008中的傳統Web服務。現在我意識到我應該提到這一點,謝謝指出! – ajeh

相關問題