wcf契约版本处理与异常处理(随记)
-----------版本控制策略;必须支持向后兼容;----就是当服务端发生改变,但客户端未更新会不会发生错误;
一旦契约发布,若要契约发生变化,如何不影响客户端使用;
----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契约版本处理与异常处理(随记)的更多相关文章
- 【WCF--初入江湖】06 WCF契约服务行为和异常处理
06 WCF契约服务行为和异常处理 一.WCF契约服务行为 [1] 服务行为可以修改和控制WCF服务的运行特性. 在实现了WCF服务契约后,可以修改服务的很多执行特性. 这些行为(或者特性)是通过配置 ...
- wcf契约随记
1.wcf契约分为:服务契约,操作契约,消息契约.数据契约 -------------------服务契约: [ServiceContract( Name = "name_IUser&quo ...
- WCF契约定义及主要用途
我们在使用WCF时,对其制定各种各样的规则,就叫做WCF契约.任何一个分布式的应用程序在传递消息的时候都需要实现制定一个规则. WCF配置文件相关操作技巧解析 全方位解读WCF Address配置文件 ...
- WCF - 契约
契约就是双方或多方就某个问题达成的一种的共识 服务提供者通过契约的形式将服务公布出来 服务消费者根据契约来消费 这样通过契约这个中间者就可以规范服务提供的内容 而服务消费者也可以根据契约来使用服务端 ...
- WCF入门(七)——异常处理1
首先以一个简单的例子演示一下远程调用发生异常的结果: 服务器端代码如下: [ServiceContract] public interface IService1 { [OperationContra ...
- WCF契约之---服务契约 、数据契约、 消息契约
本篇博文只是简单说下WCF中的契约的种类.作用以及一些简单的代码示例.在WCF中契约分为服务契约.数据契约和消息契约.下面对这几种契约进行简单的介绍. 服务契约 服务契约描述了暴露给外部的类型(接口或 ...
- 5.6版本GTID复制异常处理一例(转)
http://imysql.com/2014/07/31/mysql-faq-exception-replication-with-gtid.shtml 昨天处理了一个MySQL 5.6版本下开启GT ...
- WCF学习 (三)深入认识WCF契约
什么是契约? 从SOA概念上讲,契约属于服务公开接口的一部分.一个服务契约,定义了服务端公开的服务方法,使用传输协议,可访问地址,传输的消息格式等内容.换句话说:契约描述了该服务的功能和作用,它告诉S ...
- 不同JDK版本的流异常处理
1.JDK7以前的流异常try-catch处理 public static void main(String[] args) { FileInputStream fis = null; try { f ...
随机推荐
- JavaScript面向对象旅程(下)
JavaScript面向对象旅程 剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方 ...
- tomcat-jQ-springMVC-bootstrap
基于tomcat-jQ-springMVC-bootstrap的公司产品管理WEB应用 管理员登录后台以后才能操作 ,权限管理只有一个管理员, 系统的主要作用是查看所有的 “公司列表”, 并查看该公司 ...
- 使用Team Foundation Server 2012源代码管理基本
原文:使用Team Foundation Server 2012源代码管理基本 本篇体验Team Foundation Server 2012安装及源代码管理. □ 安装 搜索"team ...
- windows server 2008见安装IIS方法(解决)
windows server 2008见安装IIS方法(解决) 刚开始有点蒙,后来才知道原来如此.! . 右键点击[我的电脑]--[管理]--[字符]--[加入角色]--仅落后win7像.啊! 版权声 ...
- Android游戏开发研究帧动画实现
1.动画的原则框架 帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...
- Nyoj 一笔画问题(图论)
描述 zyc从小就比较喜欢玩一些小游戏,其中就包括画一笔画,他想请你帮他写一个程序,判断一个图是否能够用一笔画下来. 规定,所有的边都只能画一次,不能重复画. 输入 第一行只有一个正整数N(N&l ...
- 一个IIS网站的异常配置的安全解决方案
一个.如下面的错误: "/"应用server错. 安全异常 说明: 应用程序试图运行安全策略不同意的操作.要授予此应用程序所需的权限.请与系统管理员联系,或在配置文件里更改该应用程 ...
- Android Animation 动画Demo(Frame帧动画)
上一页介绍Animation动画第一:Tween吐温动画. 本文介绍了以下Animation也有动画的形式:Frame帧动画. Frame动画是一系列照片示出的顺序按照一定的处理,和机制,以放电影很阶 ...
- 第22章 职责链模式(Chain of Responsibility)
原文 第22章 职责链模式(Chain of Responsibility) 职责链模式 导读:职责链模式是一个既简单又复杂的设计模式,刚开始学习这个设计模式的时候光示例都看了好几遍.就为了理清里面的 ...
- 第20章 状态模式(State Pattern)
原文 第20章 状态模式(State Pattern) 状态模式 概述: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表 ...