2010-04-13 19 views
3

我在我的服務器和我的Web服務上有相同的類。 我有以下的WebMethod:無法將列表<T>轉移到網絡服務?

[WebMethod] 
     public int CreateOrder(List<Purchase> p, string username) 
     { 
      o.Add(new Order(p,username)); 

      return o.Count; 
     } 

但是下面的代碼,在服務器上運行:

protected void CartRepeater_ItemCommand(object source, RepeaterCommandEventArgs e) 
    { 
     List<Purchase> l = ((List<Purchase>)Session["Cart"]); 

     if (e.CommandName == "Order") 
     { 
      localhost.ValidateService WS = new localhost.ValidateService(); 
      WS.CreateOrder(l, Session["username"].ToString()); 
     } 
    } 

提供了以下錯誤:Argument '1': cannot convert from 'System.Collections.Generic.List<Purchase>' to 'localhost.Purchase[]'

如何將list<Purchase>對象轉移到Web服務?

回答

7

使用類似的網絡服務時,默認情況下List<T>被轉換爲數組(T[])。在將它傳遞給方法之前,通過執行.ToArray()將列表轉換爲數組。

另一種方法是將Web服務代碼生成設置更改爲使用列表而不是數組。

看起來你也有重複的類,它們都是本地的,稱爲Purchase,也是通過Web服務生成的類,也稱爲Purchase。即使它們具有相同的名稱,它們也是兩種不同的類型(它們的名稱空間不同)。您必須堅持使用一組類型,或使用類似Automapper的東西來映射您的兩組類型。

+0

仍然沒有運氣。錯誤是'Argument'1':無法從'Purchase []'轉換爲'localhost.Purchase []'' – iTayb 2010-04-13 10:00:56

+0

@iTayb'Purchase'!='localhost.Purchase' – mxmissile 2010-04-13 10:17:15

+0

我怎樣才能使用其中的一個?他們不在同一臺服務器上。 – iTayb 2010-04-13 10:20:13

1

這是因爲web服務使用SOAP傳輸數據,這是一種XML協議。它對.NET列表或許多其他奇特對象一無所知。

所以在你的情況下,它實際上是在傳遞一個數組,而Matti已經說過,解決方案就是簡單地使用一個Array來代替。

1

您無法將列表<T>序列化到xml中,<T>位顯然會變成格式錯誤的xml標記。

您可以創建一個新的對象,它繼承自列表<T>,然後將很好地序列化並通過您的Web服務,這是最佳實踐no-nos的雷區,但有時您需要妥協。

2

如果您使用svcutil生成客戶端代理類,則可以使用collectionType選項來強制代理使用非默認陣列的類型。這當然是用於生成WCF服務代理的東西;我不是100%確定它是否與ASMX服務一起使用。

無論如何,這是從實踐中實現:

svcutil.exe /collectionType:System.Collections.Generic.List`1 [service url] 
0

localohost.ValidateService是一個代理類,用他自己的命名空間類:然後在「命令」是不一樣的「localhost.Order」

如果在同一療法web服務類中的其他方法您調用Web服務, 試試這個:

tihs.CreateOrder(L,會話[ 「用戶名」]的ToString());