黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統(tǒng) 2031 0

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

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

----wsdl:契約;

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

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

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

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

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

---

數(shù)據(jù)契約的變化??? 對客戶端的影響

添加non-required?? 無影響;

添加新的required?? 會報錯;

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

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

修改數(shù)據(jù)類型;????? 如果類型兼容,會產(chǎn)生未知異常,否則報錯;

?

?

解決版本兼容性;

----Iextensibledataobject是將冗雜的數(shù)據(jù)進行臨時的保存;

?public class DataUser:IExtensibleDataObject

{

?????? private ExtensionDataObject obj;

?????? public ExtensionDataObject ExtensionData

?????? {

?????????? get

?????????? {

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

?????? ????}

?????????? set

?????????? {

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

?????????? }

?????? }

}

?

----數(shù)據(jù)契約序列化器;測試新舊版本兼容;

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文件了;

?

-----------可擴展數(shù)據(jù)對象:

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;

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

??????? }

??? }

}

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

--以上是可擴展數(shù)據(jù)對象;

禁止使用可擴展數(shù)據(jù)對象:

<behaviors >

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

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

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

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

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

</behaviors>

后者是:

? [ServiceBehavior( IgnoreExtensionDataObject=true)]

??? public? class Person:IExtensibleDataObject

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

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

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

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

-------

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

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

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

?

4.參數(shù)發(fā)生了變化,升級版本;

5.刪除了參數(shù):不用升級版本;

----數(shù)據(jù)契約:

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

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

3.數(shù)據(jù)類型,名稱發(fā)生變化,需要升級;

---

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

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

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

2.soap1.2

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

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

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

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

?? Node:可選;描述產(chǎn)生錯誤的節(jié)點URI;

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

4. 是否包含敏感信息;

兩種方式:

1.在wcf服務中標記:

[ServiceBehaviorAttribute(IncluedeExceptionDetailsInFaults=true)]

puFaultblic class service:Iservice

{

}

2.web配置節(jié)點中的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:必須是數(shù)據(jù)契約或是可序列化類型;也可以是clr特有的異常(不利于互操作)云因如果客戶端是java,和。net定義異常不一樣,容易出現(xiàn)錯誤;T:為數(shù)據(jù)契約,更好的互操作;

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

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契約版本處理與異常處理(隨記)


更多文章、技術(shù)交流、商務合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論