使用DataContractSerializer

  终结点(包括地址、绑定、契约)可通过代码以编程方式添加到服务中。如:


using(ServiceHost host =new ServiceHost(typeof(DerivativesCalculator),
new Uri[] { new Uri("http://localhost:8000/Derivatives") }))
{
host.AddServiceEndpoint(typeof(IServiceViewOfService), new BasicHttpBinding(), "Calculator");
host.Open(); Console.WriteLine("The service is available."); [......]
}

  类似地,客户端亦可直接通过编程方式包含服务终结点信息,而无需引用应用程序配置的终结点信息:

string address ="http://localhost:8000/Derivatives/Calculator";
ChannelFactory<IClientViewOfService> factory =new ChannelFactory(IClientViewOfService>(
new BasicHttpBinding(),
new EndpointAddress(new Uri(address)));
IClientViewOfService proxy = factory.CreateChannel();

  DataContractSerializer能自动序列化任何实现了System.Runtime.Serialization.ISerializable接口的.NET类型。

  通过实现System.Runtime.Serialization.IExtensibleDataObject接口,类会另外分配一些空 间,这样System.Runtime.Serialization.DataContractSerializer可以用来存储、访问数据契约其他版本 可能包含的其他成员的值。这样,当同一个数据契约的更高级版本包含服务版本所没有的成员 时,System.Runtime.Serialization.DataContract-Serializer就能将这些成员的值传给服务。

  当需要使用参数类型的子类型的实例作为输入来访问服务时,就必须添加 System.ServiceModel.ServiceKnownType特性,这意味着我们应该避免使用继承关系作为数据契约升级版本的方法。如果定 义的是父类型参数,但接收到的却是子类型,除非修改代码为预测到的子类型添加System.ServiceModel.ServiceKnownType 特性,否则子类型的序列化将会失败。

  通过使用System.Runtime.Serialization.DataContract和 System.Runtime.Serialization.DataMember特性,可以非常简单地让WCF的 System.Runtime.Serializa-tion.DataContractSerializer将开发者定制的数据类型序列化。

  实现System.Runtime.Serialization.IExtensibleDataObject接口通常是一个很好的做法,因为这样同一数据契约的不同版本可以相互独立地改进,而它们又能一起使用。

  WCF对System.Runtime.Serialization.DataContractSerializer的调用被隐藏起来了,以下代码显示调用了DataContractSerializer将数据序列化成XML:

MemoryStream stream =new MemoryStream();
DataContractSerializer serializer =new DataContractSerializer(typeof(ClientViewOfData));
serializer.WriteObject(stream, calculation);
Console.WriteLine(UnicodeEncoding.UTF8.GetChars(stream.GetBuffer());

异常处理

  当服务发生异常时,数据契约也能帮助通知客户端。如下所示:


//服务器端代码
//数据契约
[DataContract]
publicclass SomeError
{
[DataMember]
publicstring Content;
} //服务接口
//利用System.ServiceModel.FaultContract特性为操作添加一个出错契约
//这将告诉客户端,服务有可能返回一个由SomeError数据契约定义的格式的错误消息,而不是返回预期的结果
[OperationContract(Name="Faulty")]
[FaultContract(typeof(SomeError))]
decimal DivideByZero(decimal input); //服务类
publicclass DerivativesCalculator : IServiceViewOfService
{
[...]
publicdecimal DivideByZero(decimal input)
{
try
{
decimal denominator =;
return input / denominator;
}
catch(Exception exception)
{
SomeError error =new SomeError();
error.Content = exception.Message;
//SomeError的实例通过FaultException<T>泛型传递给调用者
thrownew FaultException<SomeError>(error);
}
}
} //客户端代码
//手动添加接口方法和出错契约
[ServiceContract(Name="DerivativesCalculator")]
[KnownType(typeof(DerivedData))]
publicinterface IClientViewOfService
{
[...]
[OperationContract(Name="Faulty")]
[FaultContract(typeof(SomeError))]
decimal DivideByZero(decimal input);
} publicclass Program
{
publicstaticvoid Main(string[] args)
{
using(ServiceHost host =new ServiceHost(typeof(DerivativesCalculator),
new Uri[]{ new Uri("http://localhost:8000/Derivatives") }))
{
host.AddServiceEndpoint(typeof(IServiceViewOfService),
new BasicHttpBinding(), "Calculator");
host.Open(); Console.WriteLine("The service is available.");
string address ="http://localhost:8000/Derivatives/Calculator"; ChannelFactory<IClientViewOfService> factory =new ChannelFactory<IClientViewOfService>(
new BasicHttpBinding(), new EndpointAddress(new Uri(address)));
IClientViewOfService proxy = factory.CreateChannel(); [...] try
{
Decimal quotient = proxy.DivideByZero();
}
catch(FaultException<SomeError> error)
{
Console.WriteLine("Error: {0}", error.Detail.Content);
} [...]
}
}
}

  WCF也提供了给客户端返回任何在服务中发生的未预测到的异常的完整信息的功能,这通常在调度一个服务的过程中很有用。这个功能可以通过使用 System.ServiceModel-.DescriptionServiceDebugBehavior行为的 IncludeExceptionDetailInFaults属性来打开。该属性可在配置文件中设置,这将导致任何未被处理的异常都传输给客户端。但在 最后的产中版本里打开此属性将会是不安全的,因为将异常的所有信息都传递给客户端可能会暴露一些对服务会造成危害的信息。

WCF揭秘学习笔记(3):使用DataContractSerializer的更多相关文章

  1. WCF揭秘学习笔记(1):基础知识

    最近找工作,面试时经常被问懂不懂WCF.不少招聘高级.NET工程师的要求上都 写着有WCF开发经验的优先考虑.我对于WCF仅仅是通过看一些教学视频这种山寨学习法了解一些.现在要下决心好好学习一下WCF ...

  2. WCF揭秘学习笔记(2):数据表示

    背景知识 WCF提供了一种语言为软件通信建模,称作服务模型.使用更底层的编程架构提供的类可以从这种语言建立的模型中生成可用的通信软件. 在服务模型使用的语言中,负责通信的软件部分称为服务(servic ...

  3. WCF揭秘学习笔记(5):WF定制活动

    WF(Windows Workflow Foundation,Windows工作流基础)为.NET提供了一种基于模型的.声明方式的过程执行引擎,它改变了传统的通过一行行编写代码来开发服务功能的方式. ...

  4. WCF揭秘学习笔记(4):可信赖会话、会话管理、队列、事务

    可信赖会话 WCF的可信赖会话在绑定层保证消息只会被传输一次,并且保证消息间的顺序.当使用TCP通信时,协议本身保证了可靠性,但它只在两点间的网络 包这个层面提供了这样的保证.WCF的可信赖会话特性保 ...

  5. WCF双工学习笔记

    WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到. WCF双工支持两种bind,一是nettcp.另一个是wsDualHttp,这里 ...

  6. ASP.NET MVC5框架揭秘 学习笔记01

    1.自治视图 在早期(作者也没说明是多早,自己猜吧),我们倾向于将所有与UI相关的操作糅合在一起(现在我身边还有很多人这样做),这些操作包括UI界面的呈现. 用户交互操作的捕捉与响应(UI处理逻辑). ...

  7. WCF 学习笔记之异常处理

    WCF 学习笔记之异常处理 1:WCF异常在配置文件 <configuration> <system.serviceModel> <behaviors> <s ...

  8. Dynamic CRM 2013学习笔记(二十二)插件里调用WCF服务

      1. 添加service:     2.调用WCF BasicHttpBinding myBinding = new BasicHttpBinding(); myBinding.Name = &q ...

  9. WCF学习笔记之事务编程

    WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...

随机推荐

  1. SpringBoot基础的使用

    springboot的基础使用 和 内部原理 高级使用整合 进行web开发 springboot 看下spring的所有项目:https://spring.io/projects 等等 就不一一介绍了 ...

  2. SDN原理 OpenFlow协议 -3

    问题4:流表匹配 OF1.1版本 这是OF1.1版本的操作,引入了多流表,1.0版本并没有多流表. 多流表的匹配称为 流水线处理:交换机从流表0开始查找,按照流表序号从小到大匹配. 每个包按照优先级去 ...

  3. [BZOJ1877][SDOI2009]SuperGCD

    题目大意 求两个个高精度数的gcd 题目解析 在学习gcd的时候,书上就记载了"更相减损术"这一方法 基于这种方法,我们进行优化,使得我们能快速求出两个大数的gcd 对于 \(a, ...

  4. POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)

    http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图 ...

  5. SRM 585 DIV2

    250pt: 一水... 500pt:题意: 给你一颗满二叉树的高度,然后找出出最少的不想交的路径并且该路径每个节点只经过一次. 思路:观察题目中给的图就会发现,其实每形成一个 就会存在一条路径. 我 ...

  6. php 数值数组

    <?php $cars=array("Volvo","BMW","Toyota"); echo ] . ] . ] . ". ...

  7. XML_CPP_资料_libXml2_01

    ZC: 看了一些 C/C++的XML文章,也看了一些 Qt的 QXmlQuery/QXmlSimpleReader/QXmlStreamReader/QXmlStreamWriter 的文章.总体感觉 ...

  8. C# Word转PDF/HTML/XML/XPS/SVG/EMF/EPUB/TIFF

    一款有着强大的文档转换功能的工具,无论何时何地都会是现代办公环境极为需要的.在本篇文章中,将介绍关于Word文档的转换功能(Word转XPS/SVG/EMF/EPUB/TIFF).希望方法中的代码能为 ...

  9. UVALive 5903 Piece it together 二分匹配,拆点 难度:1

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  10. 由于BOM头导致的Json解析出错

    上周五改完一些BUG后,测试通过就安心在家过了个周末.结果周一回来一看,整个安卓APP所有的接口都挂掉了1.查找bug 首先想到的是客户端代码有问题,然后想起来上周五还能运行得好好的手机也是同样的错误 ...