一、代码案例

首选建立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. bhp 阅读笔记 OSX 下 setuptools pip 安装

    安装 python-setuptools python-pip 尝试 brew install python-setuptools 失败 brew update 失败 $ cd `brew --pre ...

  2. Python拾遗

    for...else...语句 用 break 关键字终止当前循环就不会执行当前的 else 语句,而使用 continue 关键字快速进入下一论循环,或者没有使用其他关键字,循环的正常结束后,就会触 ...

  3. mysql 1093 - You can't specify target table 'xx表' for update in FROM clause

    为了修复节点表某批次数据的用户数据,做出了以下尝试: , name , , )); 执行:[Err] 1093 - You can't specify target table 'zs_work_ap ...

  4. webpack快速入门——webpack3.X 快速上手一个Demo

    1.进入根目录,建两个文件夹,分别为src和dist 1).src文件夹:用来存放我们编写的javascript代码,可以简单的理解为用JavaScript编写的模块. 2).dist文件夹:用来存放 ...

  5. Java内存模型Cookbook

    前言 指令重排 内存屏障 多处理器 指南 前言 这是一篇用于说明在JSR-133中制定的新Java内存模型(JMM)的非官方指南. 这篇指南提供了在最简单的背景下各种规则存在的原因,而不是这些规则在指 ...

  6. iOS多线程---GCD中线程的通信

    在子线程的任务完成后,有时候需要从子线程回到主线程,刷新UI. 从子线程中回到主线程,以前已经写过一种方法: [self.imageView performSelectorOnMainThread:@ ...

  7. (转)mysql explain详解

    原文:http://www.cnblogs.com/xuanzhi201111/p/4175635.html http://yutonger.com/18.html http://www.jiansh ...

  8. (转)Mysql常用命令行

    原文:http://www.cnblogs.com/TsengYuen/archive/2012/01/11/2319034.html Mysql常用命令行 Mysql经常使用号令行大全 熬头招.my ...

  9. Java之IO(一)InputStream和OutputStream

    转载请注明源出处:http://www.cnblogs.com/lighten/p/6964702.html 1.前言 计算机的IO操作一直都是比较重要的一环,IO顾名思义,就是输入输出流.不管是磁盘 ...

  10. Java学习之路(十):异常

    ---恢复内容开始--- 异常的概述和分类 Throwable类是Java语言中所有错误或者异常的超类(也就是说,Java中所有的报错都是继承与Throwable的),也只有当对象是此类或者此类的子类 ...