成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

WCF數(shù)據(jù)契約變更基本應(yīng)用技巧分析

開(kāi)發(fā) 開(kāi)發(fā)工具
WCF數(shù)據(jù)契約變更的一些實(shí)際操作技巧將會(huì)在這里為大家詳細(xì)介紹一下,初學(xué)者們可以通過(guò)這里介紹的內(nèi)容充分掌握這一技巧。

WCF中,數(shù)據(jù)契約的應(yīng)用是一個(gè)十分重要而且基礎(chǔ)的操作技術(shù)。那么今天我們將會(huì)在這篇文章中為大家詳細(xì)講解一下有關(guān)WCF數(shù)據(jù)契約變更的相關(guān)知識(shí),以方便大家在實(shí)際應(yīng)用中獲得一些幫助。#t#

Person DataContract 定義了兩個(gè)屬性:FirstName 和LastName。如果客戶端引用了這個(gè)服務(wù),而你后來(lái)將LastName改成SurName,實(shí)際上客戶端不會(huì)中斷,但是在客戶端的代理類上的LastName屬性會(huì)顯示為空的。這是因?yàn)楫?dāng)客戶端解串信息到Person類的時(shí)候,不會(huì)找到任何叫做Lastname的元素。

這個(gè)簡(jiǎn)單的WCF數(shù)據(jù)契約變更不會(huì)引起客戶端的錯(cuò)誤,但它會(huì)導(dǎo)致更嚴(yán)重的問(wèn)題:一個(gè)意外的行為。這個(gè)錯(cuò)誤很容易跟蹤,但是跟蹤變更行為是非常困難的。

這個(gè)簡(jiǎn)單的例子說(shuō)明為什么任何服務(wù)變更和它們后續(xù)的影響是至關(guān)重要的。除非你自己知道利用你的web服務(wù)的每個(gè)客戶端應(yīng)用程序,否則變更會(huì)是個(gè)災(zāi)難。作為一名開(kāi)發(fā)人員,你需要盡一切努力使你的客戶端避免變更的出現(xiàn)。

首先,你可以應(yīng)用一些***的方法來(lái)幫助客戶端免于內(nèi)部變更。WCF數(shù)據(jù)契約變更的更新版本如以下所示:

 

 

  1. [DataContract(Namespace="http://types.mycompany.com/2009/05/25",
     
    Name="PersonContract")]   
  2. public class Person : IExtensibleDataObject  
  3. {  
  4. private string _firstName = string.Empty;  
  5. private string _lastName = string.Empty;  
  6. private ExtensionDataObject _extensionData;  
  7. [DataMember(Name="FirstName")]  
  8. public string FirstName  
  9. {  
  10. get { return _firstName; }  
  11. set { _firstName = value; }  
  12. }  
  13. [DataMember(Name="LastName")]  
  14. public string LastName  
  15. {  
  16. get { return _lastName; }  
  17. set { _lastName = value; }  
  18. }  
  19. public ExtensionDataObject ExtensionData  
  20. {  
  21. get { return _extensionData; }  
  22. set { _extensionData = value; }  
  23. }  

 

在DataContract上增加的Namespace, Name和Order參數(shù)以及DataMember屬性控制DataContractSerializer的行為。當(dāng)服務(wù)的reference被添加的時(shí)候,這個(gè)增加的東西生成客戶端代理。Name參數(shù)讓serializer使用所指出的值,而不是實(shí)際公布的成員或是屬性的名字。這個(gè)方法在沒(méi)有影響客戶端的情況下允許變更的內(nèi)部執(zhí)行。例如,考慮以下的WCF數(shù)據(jù)契約變更:

 

  1. [DataMember(Name="LastName")]   
  2. public string SurName  
  3. {  
  4. get { return _lastName; }  
  5. set { _lastName = value; }  

將"FirstName" 改成"SurName"的屬性名字變更不會(huì)中斷現(xiàn)有的客戶端,因?yàn)榭蛻舳耸褂玫腘ame參數(shù)仍然是"FirstName."。只是內(nèi)部執(zhí)行被該改變了。

第二個(gè)顯著的變化是增加了IExtensibleDataObject接口。執(zhí)行這個(gè)接口允許客戶端保留在契約中沒(méi)有明確定義的數(shù)據(jù)。這似乎看上去沒(méi)什么用,但是在客戶端希望執(zhí)行示例Person對(duì)象并返回它的情況下,客戶端可以保留新的數(shù)據(jù)項(xiàng)目。例如,用以下不會(huì)強(qiáng)迫現(xiàn)有的客戶端進(jìn)行更新的新成員來(lái)更新PersonContract:

 

  1. [DataMember(Name = "MiddleName"Order = 3)]   
  2. public string SurName  
  3. {  
  4. get { return _middleName; }  
  5. set { _middleName = value; }  

實(shí)際上,這個(gè)成員通過(guò)往返過(guò)程的服務(wù),允許現(xiàn)存的客戶端保留放在"MiddleName"中的值。執(zhí)行IExtensibleDataObject對(duì)你的WCF數(shù)據(jù)契約變更未來(lái)的論證是一個(gè)有益的方法。

請(qǐng)記住,實(shí)際上客戶端對(duì)一個(gè)外部構(gòu)架有驗(yàn)證信息的選擇權(quán)。(對(duì)WCF應(yīng)用程序添加信息構(gòu)架驗(yàn)證的詳細(xì)討論,請(qǐng)閱讀此文章this article)。因此,當(dāng)處理數(shù)據(jù)契約的變更時(shí)你有兩種情況需要考慮:有構(gòu)架驗(yàn)證和沒(méi)有構(gòu)架驗(yàn)證。

當(dāng)客戶端添加構(gòu)架驗(yàn)證的時(shí)候,在數(shù)據(jù)契約中進(jìn)行添加,變更或是減去任何項(xiàng)目將導(dǎo)致驗(yàn)證的失敗。所以,在嚴(yán)格的構(gòu)架驗(yàn)證被使用的情況下,不能對(duì)契約進(jìn)行改變。相反,你需要?jiǎng)?chuàng)建一個(gè)完整的新的契約并在這個(gè)契約中使用不同的命名空間來(lái)顯示新版本。

例如,從執(zhí)行的角度來(lái)看,你需要兩個(gè)單獨(dú)的服務(wù)終端使這兩個(gè)版本可用:

Original Version: [DataContract(Namespace="http://schemas.mycompany.com/2009/05/25")]

New Version: [DataContract(Namespace=http://schemas.mycompany.com/2009/06/18)]

幸運(yùn)的是,嚴(yán)格的構(gòu)架驗(yàn)證不是默認(rèn)的行為。這意思是在沒(méi)有中斷服務(wù)端的情況下,你可以添加或刪除數(shù)據(jù)成員。但是,由于先前所討論的有不預(yù)期的行為會(huì)產(chǎn)生,刪除數(shù)據(jù)成員不是一個(gè)好主意。另一方面,添加一個(gè)數(shù)據(jù)成員是很容易做到的,而且consumers會(huì)忽略它們還沒(méi)有意識(shí)到的外部成員。

關(guān)鍵的做法是使用DataMember屬性(先前討論過(guò)的)的Order參數(shù)。使用這個(gè)參數(shù)可以告訴serializers什么樣的順序(每個(gè)成員的)可以出現(xiàn)在XML中

來(lái)自基礎(chǔ)類型的成員

沒(méi)有order參數(shù)(按字母順序排列)的成員

有order參數(shù)(按值排列)的成員

WCF數(shù)據(jù)契約變更考慮的***情況是改變一個(gè)數(shù)據(jù)成員的類型。這種情況下,***的方法是創(chuàng)建一個(gè)新版本的數(shù)據(jù)契約并帶有新的服務(wù)契約,執(zhí)行和終端。

責(zé)任編輯:曹凱 來(lái)源: IT專家網(wǎng)
相關(guān)推薦

2010-03-01 16:04:31

WCF服務(wù)契約

2010-02-25 10:52:29

WCF響應(yīng)服務(wù)

2010-02-26 13:40:28

WCF消息頭

2010-03-01 09:48:23

WCF會(huì)話服務(wù)

2010-03-01 15:40:04

WCF實(shí)例停用

2010-02-25 18:04:02

WCF IIS宿主

2010-02-23 15:58:57

WCF Session

2010-03-01 11:24:31

WCF面向服務(wù)

2010-02-22 17:51:46

WCF傳較大數(shù)據(jù)

2010-02-22 15:27:05

WCF數(shù)據(jù)契約

2009-11-09 09:23:10

WCF數(shù)據(jù)契約

2009-11-06 09:39:40

WCF契約

2010-02-23 17:44:22

WCF數(shù)據(jù)契約

2013-12-12 16:10:21

Lua腳本語(yǔ)言

2009-11-06 15:02:47

WCF契約查詢

2010-02-06 16:16:01

C++冒泡排序

2010-02-25 16:45:13

WCF應(yīng)用技巧

2010-02-22 16:26:47

WCF傳輸數(shù)據(jù)

2009-11-09 14:46:09

WCF集合契約等價(jià)

2010-03-02 09:24:22

WCF變更行為
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲欧美一区二区三区1000 | 天天看天天操 | 凹凸日日摸日日碰夜夜 | 久久性 | 99久久婷婷国产综合精品电影 | 日本综合在线观看 | 日本成人三级电影 | 欧美一区二区大片 | 久久久久久综合 | 亚洲视频精品 | 99精品欧美一区二区蜜桃免费 | 精品一区二区久久久久久久网精 | 在线国产小视频 | 日韩综合一区 | 在线色网 | 日日精品 | 玖玖久久| 久久国产欧美日韩精品 | 成人在线精品 | 欧美一级免费看 | 成人日b视频 | 国产免费一区二区三区 | 欧美一区二区三区四区五区无卡码 | 国产精品自产拍在线观看蜜 | 国产在线一区二区三区 | 天堂一区二区三区 | 天天影视色综合 | 国产高清在线精品一区二区三区 | 中文字幕在线一区二区三区 | 亚洲网站在线播放 | 亚洲欧美一区二区在线观看 | 午夜91| 午夜精品视频在线观看 | 99精品免费久久久久久久久日本 | 国产精品资源在线观看 | 亚洲网站在线观看 | 午夜影院黄 | 国产95在线 | 国产1区 | 欧美一区二区三区久久精品视 | 亚洲xx在线|