亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

wcf契約版本處理與異常處理(隨記)

系統 1624 0

-----------版本控制策略;必須支持向后兼容;----就是當服務端發生改變,但客戶端未更新會不會發生錯誤;

一旦契約發布,若要契約發生變化,如何不影響客戶端使用;

----wsdl:契約;

服務契約的變化--對客戶端的影響:

操作簽名的增加 (無影響,默認缺省值)

操作簽名的刪除(無影響,默認被忽略掉)

增加新的操作(無影響,客戶端不知道)

刪除操作、修改參數類型、修改返回值(報錯)

---

數據契約的變化??? 對客戶端的影響

添加non-required?? 無影響;

添加新的required?? 會報錯;

刪除 non-required? 不會報錯 但會丟失;

刪除required??????? 會報錯;

修改數據類型;????? 如果類型兼容,會產生未知異常,否則報錯;

?

?

解決版本兼容性;

----Iextensibledataobject是將冗雜的數據進行臨時的保存;

?public class DataUser:IExtensibleDataObject

{

?????? private ExtensionDataObject obj;

?????? public ExtensionDataObject ExtensionData

?????? {

?????????? get

?????????? {

?????????????? return obj;

?????? ????}

?????????? set

?????????? {

?????????????? obj = value;

?????????? }

?????? }

}

?

----數據契約序列化器;測試新舊版本兼容;

1.using System.Runtime.Serialization;

2.????????? Person p = new Person();

??????????? p.Name = "郭澤峰";

??????????? DataContractSerializer ds = new DataContractSerializer(typeof(Person));

??????????? FileStream fs = new FileStream("cc.xml", FileMode.Create);

??????????? ds.WriteObject(fs, p);

??????????? fs.Close();

? public partial class Form1 : Form

??? {

??????? public Form1()

??????? {

??????????? InitializeComponent();

??????? }

??????? private void button1_Click(object sender, EventArgs e)

??????? {

??????????? Person1 p = new Person1();

??????????? p.Name = "d";

??????????? p.Id = 123;

??????????? DataContractSerializer ds = new DataContractSerializer(typeof(Person1));

??????????? FileStream fs = new FileStream("cc.xml", FileMode.Create);

??????????? ds.WriteObject(fs, p);

??????????? fs.Close();

??????? }

??????? private void button2_Click(object sender, EventArgs e)

??????? {

??????????? //新版本到舊版本

??????????? DataContractSerializer ds = new DataContractSerializer(typeof(Person));

??????????? FileStream fs = new FileStream("cc.xml",FileMode.Open);

??????????? XmlDictionaryReader reader = XmlDictionaryReader.CreateTextReader(fs,new XmlDictionaryReaderQuotas());

??????????? Person per = (Person)ds.ReadObject(reader, false);

??????????? MessageBox.Show(per.Name);

??????????? fs.Close();

??????????? //舊版本到新版本

??????????? per.Name = "hhhhh";

??????????? DataContractSerializer dss = new DataContractSerializer(typeof(Person1));

??????????? FileStream fss = new FileStream("cc.xml", FileMode.Create);

??????????? ds.WriteObject(fss, per);

??????????? fss.Close();

??????? }

??? }

3.這樣就把對象生成xml文件了;

?

-----------可擴展數據對象:

namespace wcf1

{

??? [DataContract(Name="Person", Namespace="wcf1")]

??? public? class Person:IExtensibleDataObject

??? {

??????? [DataMember]

??????? public string Name {get;set;}

??????? private ExtensionDataObject obj;

??????? public ExtensionDataObject ExtensionData

??????? {

??????????? get

??????????? {

??????????????? return obj;

??????????? }

??????????? set

??????????? {

??????????????? obj = value;

??????????? }

??????? }

??? }

??? [DataContract(Name = "Person", Namespace = "wcf1")]

??? public class Person1 : IExtensibleDataObject

??? {

??????? [DataMember]

??????? public string Name { get; set; }

??????? [DataMember]

??????? public int Id { get; set; }

??????? private ExtensionDataObject obj;

??????? public ExtensionDataObject ExtensionData

??????? {

??????????? get

??????????? {

??????????????? return obj;

??????????? }

??????????? set

??????????? {

??????????????? obj = value;

??????????? }

??????? }

??? }

}

-----這樣就可以實現新就版本的交互了;當然也有害處,若新版本增加了1mb數據,當提交給舊版本時,這1mb相當于沒有用途;加重了負載;

--以上是可擴展數據對象;

禁止使用可擴展數據對象:

<behaviors >

???????????????????????????????????? <serviceBehaviors>

?????????????????????????????????????????????? <behavior name="aa">

??????????????????????????????????????????????????????? <dataContractSerializer ignoreExtensionDataObject="true"/>

?????????????????????????????????????????????? </behavior>

???????????????????????????????????? </serviceBehaviors>

</behaviors>

后者是:

? [ServiceBehavior( IgnoreExtensionDataObject=true)]

??? public? class Person:IExtensibleDataObject

------版本控制策略:

1.嚴格的版本控制,一旦改動重新生成,但是不實用;

2.使用的版本策略:向后或向前的兼容性;

保存未知元素和容忍缺失元素以至于可以兼容,單參數變化就不行了;

-------

1.添加操作,不用升級版本;

2.刪除操作,升級版本;

3.添加了新的參數,不用升級,會默認缺省值;

?

4.參數發生了變化,升級版本;

5.刪除了參數:不用升級版本;

----數據契約:

1.新添加成員,不用升級;

2.刪除成員,不用升級;(多余的被忽略)

3.數據類型,名稱發生變化,需要升級;

---

wcf缺省提供版本相容性支持;

------------------------------------------------------剖出異常:

1.所有異常都被序列化為soap faults; (soap 1.1和soap1.2格式)

2.soap1.2

?? Code:必須;可以是規范定義的代碼

?? Reason:必須,錯誤字符串的解釋信息

?? Role:可選;描述錯誤源的URI;

?? Detail:可選,提供錯誤的body信息;

?? Node:可選;描述產生錯誤的節點URI;

3. isoneway=true;標記后客戶端并不能捕捉異常,而響應式則捕捉

4. 是否包含敏感信息;

兩種方式:

1.在wcf服務中標記:

[ServiceBehaviorAttribute(IncluedeExceptionDetailsInFaults=true)]

puFaultblic class service:Iservice

{

}

2.web配置節點中的behavior里配置:<serviceDebug includeExceptionDetailInFaults="true">

5.剖出類型有三種:FaultException\FaultException<T>\MesssageFault:

? (1)

? throw new FaultException("");

??throw new FaultException(new FaultReason(""));

? throw new FaultException(new FaultReason(""),FaultCode.CreateSenderFaultCode(null));

? (2) FaultException<T>,不利于互操作,

? 錯誤契約:[faultContract(typeof())]

T:必須是數據契約或是可序列化類型;也可以是clr特有的異常(不利于互操作)云因如果客戶端是java,和。net定義異常不一樣,容易出現錯誤;T:為數據契約,更好的互操作;

在契約接口的每個聲明操作上添加標簽;將錯誤信息對象化;//---案例:

throw new FaultException<InvalidOperationException>(new InvalidOperationException(""), "", FaultCode.CreateSenderFaultCode(null));

public interface IReturnuser

???? {

???????? [OperationContract(IsOneWay = true)]

???????? [FaultContract(typeof(CusError))]

???????? void Return

???? }

(3) MessageFaults

MessageFault mfault = MessageFault.CreateFault(FaultCode.CreateSenderFaultCode(null), new FaultReason("錯誤"), new InvalidOperationException("an error occurred"), null, "", "");

FaultException fe = FaultException.CreateFault(mfault,typeof(InvalidOperationException));

throw fe;

wcf契約版本處理與異常處理(隨記)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩网址 | 欧美高清激情毛片 | 四虎影院国产精品 | 91视频免费看 | 又刺激又黄的一级毛片 | 另类日本人xxxxbbbb | 欧美曰韩免费视频一区 | 欧美一级永久免费毛片在线 | 国产高清不卡视频 | 99久久精品国产片久人 | 亚洲第一永久色 | 91精品国产综合久久久久 | 亚洲欧美精品天堂久久综合一区 | 国产亚洲一区二区三区啪 | 国产精品亚洲一区二区三区 | 大陆一级毛片免费视频观看i | 亚洲一区二区三区四区 | 色综合久久一本首久久 | 91中文字幕在线视频 | 深夜成人影院 | 奇米影视在线视频8888 | 91福利视频在线 | 黄色毛片免费看 | 一区二区三区四区免费视频 | 日本爱爱网 | 久久久噜噜噜久久 | 草草影院一级毛片a级 | 日韩欧美成人免费中文字幕 | 女bbbbxxxx毛片视频0 | 日本激情视频一区二区三区 | 日韩最新视频一区二区三 | 91精品国产色综合久久不卡蜜 | 四虎精品成在线播放 | 久久精品日本免费线 | 中国国语毛片免费观看视频 | 韩国网站爱久久 | 精品九九久久 | 成人精品视频在线观看 | 热re99久久精品国产99热 | 天天操天天干天天透 | 美女又xx又xx免费 |