-----------版本控制策略;必须支持向后兼容;----就是当服务端发生改变,但客户端未更新会不会发生错误;

一旦契约发布,若要契约发生变化,如何不影响客户端使用;

----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契约版本处理与异常处理(随记)的更多相关文章

  1. 【WCF--初入江湖】06 WCF契约服务行为和异常处理

    06 WCF契约服务行为和异常处理 一.WCF契约服务行为 [1] 服务行为可以修改和控制WCF服务的运行特性. 在实现了WCF服务契约后,可以修改服务的很多执行特性. 这些行为(或者特性)是通过配置 ...

  2. wcf契约随记

    1.wcf契约分为:服务契约,操作契约,消息契约.数据契约 -------------------服务契约: [ServiceContract( Name = "name_IUser&quo ...

  3. WCF契约定义及主要用途

    我们在使用WCF时,对其制定各种各样的规则,就叫做WCF契约.任何一个分布式的应用程序在传递消息的时候都需要实现制定一个规则. WCF配置文件相关操作技巧解析 全方位解读WCF Address配置文件 ...

  4. WCF - 契约

    契约就是双方或多方就某个问题达成的一种的共识  服务提供者通过契约的形式将服务公布出来 服务消费者根据契约来消费 这样通过契约这个中间者就可以规范服务提供的内容 而服务消费者也可以根据契约来使用服务端 ...

  5. WCF入门(七)——异常处理1

    首先以一个简单的例子演示一下远程调用发生异常的结果: 服务器端代码如下: [ServiceContract] public interface IService1 { [OperationContra ...

  6. WCF契约之---服务契约 、数据契约、 消息契约

    本篇博文只是简单说下WCF中的契约的种类.作用以及一些简单的代码示例.在WCF中契约分为服务契约.数据契约和消息契约.下面对这几种契约进行简单的介绍. 服务契约 服务契约描述了暴露给外部的类型(接口或 ...

  7. 5.6版本GTID复制异常处理一例(转)

    http://imysql.com/2014/07/31/mysql-faq-exception-replication-with-gtid.shtml 昨天处理了一个MySQL 5.6版本下开启GT ...

  8. WCF学习 (三)深入认识WCF契约

    什么是契约? 从SOA概念上讲,契约属于服务公开接口的一部分.一个服务契约,定义了服务端公开的服务方法,使用传输协议,可访问地址,传输的消息格式等内容.换句话说:契约描述了该服务的功能和作用,它告诉S ...

  9. 不同JDK版本的流异常处理

    1.JDK7以前的流异常try-catch处理 public static void main(String[] args) { FileInputStream fis = null; try { f ...

随机推荐

  1. MTK6572横屏的调试过程

    电视剧集:系统MTK缺省的系统源代码,Phone模式.底部有三个虚拟按键.需求为,设置成默认横屏,设定一个合理的虚拟按键方案. ------------------------------------ ...

  2. zoj 3659 并检查集合

    http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4882 现在在牡丹江,明天regional直播比赛,我会在一个月内退休.求祝福 ...

  3. 易Android登录Demo

    上一页介绍Android项目简单的页面跳转实例,算是对开发环境的熟悉,这一篇将在此基础上增加一些简单的逻辑,实现登录的效果. 登录之前: 登录成功: watermark/2/text/aHR0cDov ...

  4. jQuery.extend()方法和jQuery.fn.extend()方法

    jQuery.extend()方法和jQuery.fn.extend()方法源码分析 这两个方法用的是相同的代码,一个用于给jQuery对象或者普通对象合并属性和方法一个是针对jQuery对象的实例, ...

  5. 从头开始学JavaScript (四)——操作符

    原文:从头开始学JavaScript (四)--操作符 一.一元操作符 1.自增自减操作符:分为前置型和后置型: 前置型:++a;--a; 后置型:a++;a--; 例: <script typ ...

  6. 【高德地图API】从零开始学高德JS API(八)——地址解析与逆地址解析

    原文:[高德地图API]从零开始学高德JS API(八)——地址解析与逆地址解析 摘要:无论是百度LBS开放平台,还是高德LBS开放平台,其调用量最高的接口,必然是定位,其次就是地址解析了,又称为地理 ...

  7. 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...

  8. HDU 1251 统计拼图 Trie解决问题的方法

    基本上找到一个标准前缀的问题是,只需要insert和search它功能. 这里的主要变化是我n该记录方法,这里n国旗代表的不是叶节点,但是话的标志这条道路后的数字. 然后找到需要找到一个词的前缀,假如 ...

  9. Android实现“是否退出”对话框和“带图标的列表”对话框

    今天我们学习的内容是实现两种对话框(Dialog),第一种是询问是否退出对话框,另外一种是带图标的列表对话框,程序的执行效果是,我们点击button1的时候,弹出第一种对话框,我们点击button2的 ...

  10. CSS3+HTML5特效4 - 横向无缝滚动

    先看例子 This is a test 1. This is a test 2. This is a test 3. This is a test 4. This is a test 5. This ...