WCF中DataContract和MessageContract的区别
一、代码案例
首选建立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中DataContract和MessageContract的区别的更多相关文章
- Difference between datacontract and messagecontract in wcf
在WCF中有两种契约各自是DataContract和MessageContract,这篇博客来讲一下两者的差别.先看一下两者定义契约实体的方式有和不同. 1.数据契约 <span style=& ...
- wcf 中客户端调用之死 感悟 wcf与原来的webservice2.0 的客户端调用区别(wcf调用完不关闭的话那就把web服务搞死了)
说到wcf,本人也是刚刚使用所以不是很熟悉 在做项目的时候采用webservice+客户端程序架构 写了一个wcf中的webservice之后,又写了很多的客户端exe程序,有的是轮询调用这个webs ...
- 理解WCF中的Contracts
WCF中的Contracts WCF通过Contract来说明服务和操作,一般包含五种类型的Contract:ServiceContract,OperationContract,FaultContra ...
- WCF初探-22:WCF中使用Message类(上)
前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...
- 跟我一起学WCF(12)——WCF中Rest服务入门
一.引言 要将Rest与.NET Framework 3.0配合使用,还需要构建基础架构的一些部件.在.NET Framework 3.5中,WCF在System.ServiceModel.Web组件 ...
- 跟我一起学WCF(10)——WCF中事务处理
一.引言 好久没更新,总感觉自己欠了什么一样的,所以今天迫不及待地来更新了,因为后面还有好几个系列准备些,还有很多东西需要学习总结的.今天就来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事 ...
- WCF中事务处理
一.引言 今天来介绍下WCF对事务的支持. 二.WCF事务详解 2.1 事务概念与属性 首先,大家在学习数据库的时候就已经接触到事务这个概念了.所谓事务,它是一个操作序列,这些操作要么都执行,要么都不 ...
- 在Wcf中应用ProtoBuf替代默认的序列化器
Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...
- ajax调用本地wcf中的post和get
我们可以通过jQuery调用本地或者远程的wcf服务,本文讲解的是对本地wcf服务的post和get调用方式. post和get到底有什么区别呢?此处不作详述. 但是,post对请求的数据格式更为严格 ...
随机推荐
- docker 搭建Mysql集群
docker基本指令: 更新软件包 yum -y update 安装Docker虚拟机(centos 7) yum install -y docker 运行.重启.关闭Docker虚拟机 servic ...
- POJ 1577Falling Leaves(二叉树的建立)
题目链接:http://poj.org/problem?id=1577 解题思路:题目是中文就不翻译了,网上都说这题很水,但本蒟蒻虽然知道是倒过来建立二叉搜索树,可是实现不了,得到小伙伴的关键递归思想 ...
- PHP之旅4 php 超全局变量
预定义数组: 自动全局变量---超全局数组 1.包含了来自web服务器,客户端,运行环境和用户输入的数据 2.这些数组比较特别 3.全局范围内自动生效,都可以直接使用这些数组 4.用户不能自定义这些数 ...
- centos7启动顺序加密的问题
在上一篇博客中我们说的是如何进入单用户模式,这篇我主要来讲centos7启动加密. 首先我们来说centos的启动顺序: 上一篇我们所说的进入单用户模式,就是在boot loader 这一层次下进入的 ...
- node 本地静态服务器
直接上代码 const connect = require("connect"); const serveStatic = require("serve-static&q ...
- POJ 2316
#include<iostream> #include<stdio.h> #include<string> using namespace std; ]; int ...
- POJ 2243
#include <iostream> #include <queue> using namespace std; ][] = {-,-,-,,,-,,,,-,-,-,,,-, ...
- CPM(Cluster Percolation method)派系过滤算法
一.概念 (1)完全子图/全耦合网络/k-派系:所有节点全部两两相连 图1 这些全耦合网络也成为派系,k-派系表示该全耦合网络的节点数目为k 1)k-派系相邻:两个不同的k-派系共享k-1个节点,认为 ...
- Docker学习--基本docker命令
1.移除旧的容器 docker rm -f usdp40 2.拉新镜像 docker pull /usdp/video:c82 3.基于镜像,启动运行一个自己的容器,-d参数表示以后台进程的方式运行 ...
- Java之集合(二十)LinkedBlockingQueue
转载请注明源出处:http://www.cnblogs.com/lighten/p/7503678.html 1.前言 本章介绍阻塞队列LinkedBlockingQueue,这是一个基于链表的可选长 ...