一、代码案例

首选建立2个WCF Service,它们分别使用不同的Contract,同时创建一个Console控制台项目,作为Client:

  

其中,WcfServiceWithDataContract项目使用DataContract,具体表现为将实体类标记为[DataContract]:

[DataContract]
public class BookOrder
{
[DataMember]
public string ISBN { get; set; } [DataMember]
public string BookTitle { get; set; } [DataMember]
public string BookAddress { get; set; }
}

注:即使不添加特性DataContract,仍然默认为DataContract。

而WcfServiceWithMessageContract项目使用MessageContract,具体表现为将实体类标记为[DataContract]:

[MessageContract]
public class BookOrder
{
[MessageHeader]
public string ISBN { get; set; } [MessageBodyMember]
public string BookTitle { get; set; } [MessageBodyMember]
public string BookAddress { get; set; }
}

但是,两个Service的Operation都是相同的:

public BookOrder PlaceOrder(BookOrder bookOrder)
{
return new BookOrder() { ISBN = "", BookTitle = "WPF", BookAddress = "China" };
}

为了观察到更多的端倪,我们将参数和返回值类型都设置为了BookOrder,方法的逻辑只是简单地将参数稍作修改并返回。

二、区别

  根据Service的Contract不同(2种),以及在Client端添加Service的方式的不同(也是2种),一共有2*2=4种情形,分析如下:

情形一:UseDCRefDC(在Server端使用DataContract,在Client端生成DataContract)

我们在Client端直接Add Service Reference,指向WcfServiceWithDataContract项目生成的Service:http://localhost:1111/Service1.svc

同时,在Client端默认生成DataContract:

  

在Client端(也就是Console控制台项目),调用Service的方式如下:

public static void TestUseDCRefDC()
{
var client = new UseDCRefDC.Service1Client();
var item = new UseDCRefDC.BookOrder() { ISBN = "", BookAddress = "USA", BookTitle = "WCF" };
var result = client.PlaceOrder(item);
}

情形二:UseMCRefDC(在Server端使用DataContract,在Client端生成MessageContract)

仍然添加对WcfServiceWithDataContract这个WCF Service的引用,并点击Add Service Reference面板中的Advanced按钮,弹出Service Reference Settings面板,将“Always generate message contracts”选项选中:

  

这时在Client端生成的是MessageContract。

在Client端(也就是Console控制台项目),调用Service的方式如下:

public static void TestUseMCRefDC()
{
var client = new UseMCRefDC.Service1Client();
var item = new UseMCRefDC.BookOrder() { ISBN = "", BookAddress = "USA", BookTitle = "WCF" }; PlaceOrderRequest request = new PlaceOrderRequest(item);
PlaceOrderResponse response = client.PlaceOrder(request); var result = response.PlaceOrderResult;
}

情形三:UseDCRefMC(在Server端使用MessageContract,在Client端生成DataContract)

public static void TestUseDCRefMC()
{
var client = new UseDCRefMC.Service2Client();
var item = new UseDCRefMC.BookOrder() { ISBN = "", BookAddress = "USA", BookTitle = "WCF" }; client.PlaceOrder(ref item.ISBN, ref item.BookAddress, ref item.BookTitle);
}

情形四:UseMCRefMC(在Server端使用MessageContract,在Client端生成MessageContract)

public static void TestUseMCRefMC()
{
var client = new UseMCRefMC.Service2Client();
var item = new UseMCRefMC.BookOrder() { ISBN = "", BookAddress = "USA", BookTitle = "WCF" }; var result = client.PlaceOrder(item);
}

参考文章:

  WCF中DataContract和MessageContract的区别

  使用消息约定

传说中的WCF(8):玩转消息协定

WCF中DataContract和MessageContract的区别的更多相关文章

  1. Difference between datacontract and messagecontract in wcf

    在WCF中有两种契约各自是DataContract和MessageContract,这篇博客来讲一下两者的差别.先看一下两者定义契约实体的方式有和不同. 1.数据契约 <span style=& ...

  2. wcf 中客户端调用之死 感悟 wcf与原来的webservice2.0 的客户端调用区别(wcf调用完不关闭的话那就把web服务搞死了)

    说到wcf,本人也是刚刚使用所以不是很熟悉 在做项目的时候采用webservice+客户端程序架构 写了一个wcf中的webservice之后,又写了很多的客户端exe程序,有的是轮询调用这个webs ...

  3. 理解WCF中的Contracts

    WCF中的Contracts WCF通过Contract来说明服务和操作,一般包含五种类型的Contract:ServiceContract,OperationContract,FaultContra ...

  4. WCF初探-22:WCF中使用Message类(上)

    前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...

  5. 跟我一起学WCF(12)——WCF中Rest服务入门

    一.引言 要将Rest与.NET Framework 3.0配合使用,还需要构建基础架构的一些部件.在.NET Framework 3.5中,WCF在System.ServiceModel.Web组件 ...

  6. 跟我一起学WCF(10)——WCF中事务处理

    一.引言 好久没更新,总感觉自己欠了什么一样的,所以今天迫不及待地来更新了,因为后面还有好几个系列准备些,还有很多东西需要学习总结的.今天就来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事 ...

  7. WCF中事务处理

    一.引言 今天来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事务概念与属性 首先,大家在学习数据库的时候就已经接触到事务这个概念了.所谓事务,它是一个操作序列,这些操作要么都执行,要么都不 ...

  8. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  9. ajax调用本地wcf中的post和get

    我们可以通过jQuery调用本地或者远程的wcf服务,本文讲解的是对本地wcf服务的post和get调用方式. post和get到底有什么区别呢?此处不作详述. 但是,post对请求的数据格式更为严格 ...

随机推荐

  1. libevent源码剖析

    libevent是一个使用C语言编写的,轻量级的开源高性能网络库,使用者很多,研究者也很多.由于代码简洁,设计思想简明巧妙,因此很适合用来学习,提升自己C语言的能力. libevent有这样显著地几个 ...

  2. java实现fp-growth算法

    本文参考韩家炜<数据挖掘-概念与技术>一书第六章,前提条件要理解 apriori算法. 另外一篇写得较好的文章在此推荐: http://hi.baidu.com/nefzpohtpndho ...

  3. elasticsearch 分片(Shards)的理解

    分片重要性 Es中所有数据均衡的存储在集群中各个节点的分片中,会影响ES的性能.安全和稳定性, 所以很有必要了解一下它. 分片是什么? 简单来讲就是咱们在ES中所有数据的文件块,也是数据的最小单元块, ...

  4. 全屏背景图的实现及background的相关属性

    今天需要做一个占满设备宽度的轮播图,这里作为demo仅展示一张图,下面分别是要操作的图片(这里做了缩放处理,实际的图比较大),以及要实现的效果图,很明显两者是不成比例的:      (图一)     ...

  5. Linux 基础命令 持续更新中...

    1.ls 显示当前文件/文件夹 显示文件大小: ls -lh  显示隐藏文件: ls -a 显示文件详细信息: ls -l (ll)2.pwd 显示当前所在路径 cat 显示当前文件下所有内容3.cd ...

  6. h5移动端聊天室|仿微信界面聊天室|h5多人聊天室

    今年的FIFA世界杯甚是精彩,最近兴致高涨就利用HTML5开发了一个手机端仿微信界面聊天室,该h5聊天室采用750px全新伸缩flex布局,以及使用rem响应式配合fontsize.js,页面弹窗则是 ...

  7. java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification

    ListView UI重绘时触发layoutChildren, 此时会校验listView的mItemCount与其Adapter.getCount是否相同,不同报错. ListView.layout ...

  8. Spring Security构建Rest服务-1203-Spring Security OAuth开发APP认证框架之短信验证码登录

    浏览器模式下验证码存储策略 浏览器模式下,生成的短信验证码或者图形验证码是存在session里的,用户接收到验证码后携带过来做校验. APP模式下验证码存储策略 在app场景下里是没有cookie信息 ...

  9. 使用Second Copy同步ftp服务器的差异文件

    公司一直用自主开发的一个同步工具来进行数据库文件异机备份的,但无奈太不稳定,三天两头出现服务挂死的问题,特别是最近这1个月,几天就1次. 问题现象都是服务一直在运行,但没有复制文件到备份机上,而且备份 ...

  10. EF CodeFirst Mirgration

    新建类库Models,加入以下三个类: Product: public class Product { /// <summary> /// 编号 /// </summary> ...