2010-07-01 58 views
8

我正在使用Visual Studio 2010,並且我已獲得對我們創建的Web服務的服務引用。我們的方法返回包含泛型列表屬性的對象:服務參考使用數組而不是列表<Type>,即使設置說要使用列表

public class ExampleResponse 
{ 
    private System.Collections.Generic.List<int> intValues; 

    [WCF::MessageBodyMember(Name = "IntValues")] 
    public System.Collections.Generic.List<int> IntValues  
    { 
    get { return intValues; } 
    set { intValues= value; } 
    } 
} 

在客戶端,它創建爲int [],而不是列表中References.cs文件:

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="SomeNamespace", Order=0)] 
[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)] 
[System.Xml.Serialization.XmlArrayItemAttribute(Namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays", IsNullable=false)] 
public int[] IntValues; 

在服務引用設置集合類型設置爲使用列表,而不是數組。但是,它仍在這樣做。

任何有關如何解決這個問題的信息將是非常有用的,它似乎沒有任何意義。

回答

9

您是否添加了「服務參考」或「Web參考」?看來代理是使用XmlSerializer而不是DataContractSerializer生成的。如果使用了DataContractSerializer,則可以使用System.Runtime.Serialization ... Attributes而不是Xml.Serialization ...屬性。您是如何生成此Web參考的?更新後的XmlSerializer會將所有集合轉換爲數組,數據合同串行器知道如何生成.Net數據類型。添加Web引用使用XmlSerializer BTW。

此外,我很好奇你使用MessageBodyMember。你爲什麼試圖產生你自己的MessageContracts。用MessageContracts混淆可能是非常危險的,特別是如果你不確切知道你在做什麼。

相反,請嘗試以下操作:

[DataContract] 
public class ExampleResponse 
{ 
    private System.Collections.Generic.List<int> intValues; 

    [DataMember] 
    public System.Collections.Generic.List<int> IntValues 
    { 
     get { return intValues; } 
     set { intValues = value; } 
    } 
} 

請參閱如何爲你工作,讓我們知道。

+0

該引用是通過右鍵單擊該項目並選擇「添加服務引用...」創建的。當對話框出現以找到Web服務時,我不選擇底部的Web引用選項。我會檢查你的另一個建議,但直到最近它一直在運行 - 它來自我們「繼承」的Web服務。 – Grandpappy 2010-07-01 17:49:23

+1

好吧,明白了。你的評論讓我失望了一條我從未想過的道路。我們有一個沒有DataContract屬性的枚舉,所以VS2010在沒有告訴我的情況下創建了一個WebReference。 我也明白你說的關於處理我們自己的消息合約,這很醜陋。 – Grandpappy 2010-07-01 18:03:51

+0

很高興我能幫到你。快樂編碼 – CkH 2010-07-01 18:39:07

2

在「添加服務參考」中,您可以選擇要將哪種類型用於集合。由於某些原因,Array是默認的。更改後,我不得不刪除整個參考並重新添加它,從頭開始選擇List。事實之後,我有奇怪的問題改變它。

+2

我已經完成了這個,通過設置Collection值,甚至可以創建引用本身。但我仍然在獲得數組。 – Grandpappy 2010-07-01 16:27:53