第二章 資料契約

2021-05-23 08:28:53 字數 2207 閱讀 3971

在乙個服務內部,功能性的應用由**實現的。在服務外部,

功能性服務在wsdl中定義。在乙個wcf服務中,應用程式資料在簡單和複雜型別表示;而在服務外部,應用程式資料由xml元資料定義表示。wcf資料契約提供了對**定義的.net clr型別與w3c組織定義用來在服務外部通訊的xml元資料定義之間的對映。

使用wcf,開發人員花費更多的時間在**和介面語義上,在xsd和wsdl語法上花費的時間會更少。那不是說xsd和wsdl語法不重要;它們是跨平台系統上進行互操作必要前提。但是編譯器也顯示出了在把由.net 語言生成的資料結構翻譯為跨平台的具有互操作性的xsd和wsdl表示的優勢。

在設計階段,[datacontract]屬性用來表示哪個類應該以xsd形式表示而且被服務在wsdl中暴露。[datamember]屬性進一步定義xsd中哪乙個類的成員應該包含在外部表示中。執行時,datacontractserializer 類使用[datacontract]和[datamember]規則把物件序列化成xml。2.7顯示了將乙個.net實現用可以與其他系統實現互操作的xml元資料表示。

2.8也顯示了在2.7中描述的同樣翻譯,同時為了區分也顯示了c#和xsd的語法。

datacontractserializer 講序列化型別並在wsdl契約中暴露它們,如果它們滿足以下條件:

標記[datacontract]和[datamember]屬性的型別

標記[collectiondatacontract]的型別

繼承自ixmlserializable 的型別

標記[serializable]的型別,成員沒有使用[nonserializable]標記

標記[serializable]的型別而且實現了iserializable介面

內建clr初始型別,比如int32和string

bytes陣列, datatime,timespan,guid,uri,xmlqualifiedname,xmlelement和xmlnode

陣列和集合,比如list, dictionary和hashtable

列舉為乙個.net類定義xml元資料

[datacontract]屬性,在system.runtime.serialization中定義,說明乙個類應該在描述服務的wsdl中以xsd暴露出來。如果乙個類沒有[datacontract]屬性,它將不會出現在wsdl中。預設的,xml元資料的名字與類的名字和元資料中的目標命名空間是一樣的:

(由.net命名空間描述)。這兩個都可以被過載。你可能想過載它們來控制在服務外部暴露的名字。比如,regorder的乙個內部類名可以在xsd中以order暴露出來。列表2.16顯示如果過載xsd的名字和命名空間。

[datamember]屬性,也定義在system.runtime.serialization, 確定將以[datacontract]屬性定義的成員包含在xml元資料中。如果乙個類的成員沒有使用[datamember]來定義屬性,就不會包含在xml元資料中,儘管它是類的成員。預設的,類成員不包含在xml元資料定義中,這是一種選擇模型。.net類成員的範圍,無論是公共的還是私有的,不影響它是否包含在xml元資料中; 決定是由[datamember]來嚴格限定的。

列表2.15演示了乙個類定義,stockprice,有5哥公共資料成員。其中三個,ticker, thecurrentprice和thecurrenttime是必須的,因為它們使用isrequired=true標記。一些額外的[datamember]特性在以下顯示:

類成員名字在**中都使用m_字首。類成員名字被過載以便於m_notation不用引入服務介面定義的xsd中。

類成員的順序由[datamember]屬性定義。如果順序沒有確定,元素將會在xsd中按字母順序排列。順序一般是不重要的,但是控制順序對互操作來說很重要。如果你在傳送訊息給乙個期待在特定方式接收順序訊息的服務,這個屬性可以控制編碼到xml文字中的元素順序。

類成員m_currentprice, m_currenttype和m_ticker標記為必須的,但是m_dailyvolume和m_dailychange不是。非必須存在的類成員可以在xml例項中被忽略而且根據xsd它們仍然被認為是合法的。

svcutil.exe –t:metadata 命令使用類中定義的[datamember]元素生成xsd。列表2.16顯示了列表2.15中的**生成的xsd。注意元素名和順序是根據**中屬性定義的。同時也要注意非必須類成員在xml元資料中定義成minoccurs=0.

WCF 第二章 契約 服務契約

服務契約描述了由服務終結點實現的介面操作。服務契約引用訊息格式並描述它們是怎麼被交換的。訊息格式更進一步被資料契約和訊息契約描述。這一部分主要涉及由服務契約實現的訊息交換。wcf在設計時和執行時使用服務契約。在設計階段,它們確定應該在wsdl理暴露為終結點的 的類。乙個使用 servicecontr...

第二章 契約 續服務契約

服務契約 服務契約描述了由服務終結點實現的介面操作。服務契約引用訊息格式並描述它們是怎麼被交換的。訊息格式更進一步被資料契約和訊息契約描述。這一部分主要涉及由服務契約實現的訊息交換。wcf在設計時和執行時使用服務契約。在設計階段,它們確定應該在wsdl理暴露為終結點的 的類。乙個使用 service...

WCF 第二章 契約

在原子和金錢世界中,契約是兩個或多個組織以乙個已知的 提供商品和服務的合同。在位元和服務的世界中,契約有類似的功能 它是兩個或多個組織之間確定訊息交換和訊息條款及條件的合同。契約是由服務終結點傳送或接收的訊息的描述。每乙個終結點都由abcs定義 乙個訊息傳送到的網路上的位址,乙個描述訊息如何傳送的繫...