在.net中, 各種型別的集合均實現了ienumerable或者ienumerable介面,乙個資料契約的資料成員可以是乙個集合型別,服務契約 也可以定義直接與集合互動的操作,但是這都是.net所特有的,wcf不能在元資料中公開它們,然後wcf專門為集合提供了編組原則。
在定義服務時候,無論使用的是ienumerable、ilist和icollection,他們的傳輸形式都使用了陣列,如
namespace
contractinte***ce
}匯出的結果為
public
inte***ce
icontractmanager
如果契約中的集合為具體集合型別而非介面,而且屬於可序列化集合,那麼只要提供的集合包含了add方法,並且符合以下簽名中的一種,wcf就能夠自動地將集合規範為陣列型別。
並非只有內建的集合型別才具有自動編組為陣列的能力,任何自定義的集合只要符合相同的先決條件,都可以被編組為陣列。
collectiondatacontract特性
前面所示的編組為具體型別的機制並不理想,原有有三
它要求集合必須可序列化,而不是使用datacontract特性。
當服務的一方處理集合型別時,服務的另外一方若處理陣列型別,就會導致雙方語義不對稱,集合擁有陣列不具備的優勢。
對於集合是否包含add方法,或者集合是否支援ienumerable和ienumerable介面,並沒有編譯時或者執行時的有效驗證。如果不符合條件,就會導致資料契約不可工作。
基於以上幾點,wcf提供了另外一種有效的解決方案,一種專用的特性:collectiondatacontractattribute,定義為:
[attributeusage
(attributetargets
.class |
attributetargets
.struct, inherited =
false
, allowmultiple =
false)]
public
sealed
class
collectiondatacontractattribute
:attribute
public
string
itemname
public
string
keyname
public
string
name
public
string
namespace
public
string
valuename
}collectiondatacontract 和datacontract相似,它不能序列化集合,將它應用到乙個集合上時,會將集合當作乙個泛型的鍊錶型別公開給客戶端鍊錶可能不會對原來的集合執行 任何操作,但它會提供乙個類似介面的集合型別,而不是陣列。例如,定義如下型別:
namespace
contractinte***ce
")]
public
class
mycollection
:ienumerable
public
ienumerator
getenumerator()}}
服務契約修改為:
namespace
contractinte***ce
}則,匯出的客戶端定義為:
mycollectionofcontract
getcontract();
集合類重新編組為
public
class
mycollectionofcontract
: system.collections.generic.
list
<
contract
>
在裝載服務時,特性會檢查add方法和ienumerable或者ienumerable是否存在,如果不存在而引發invaliddatacontractexception異常。
注意,不能同時將datacontract和collecctiondatacontract應用到集合型別上,在裝載服務的時候同樣會檢查這一點。
WCF中的自定義集合型別傳輸
wcf中的自定義集合型別,如果作為服務契約的一部分進行發布,必須要保證以下幾點 1.集合包含的型別必須使用 serializable 和 datacontract 標記 2.集合包含的型別屬性必須使用 datamember 標記,並且,如果是屬性 property 必須要實現get和set 3.集合...
如何實現WCF中的自定義集合型別傳輸
wcf中的自定義集合型別,如果作為服務契約的一部分進行發布,必須要保證以下幾點 1.集合包含的型別必須使用 serializable 和 datacontract 標記 2.集合包含的型別屬性必須使用 datamember 標記,並且,如果是屬性 property 必須要實現get和set 3.集合...
IIS7中WCF配置問題集合
1 iis註冊wcf 以管理員身份執行命令列 c windows microsoft.net framework v3.0 windows communication foundation servicemodelreg.exe r y 3 無法識別的屬性 targetframework 請注意屬性...