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对请求的数据格式更为严格 ...
随机推荐
- Python面向对象(成员修饰符)
day25 成员修饰符 class Foo: def __init__(self, name, age): self.name = name self.__age = age#私有,外部无法直接访问 ...
- 萝卜保卫战3内购破解+Toast窗口增加(Love版)
涉及到一些不同的破解的方法,以及不同的破解思路,还有一些重要权限的删除等. 作者:HAI_ 这次目标是经常玩的萝卜保卫战,不知不觉,已经更新到3了.详细分析请参考https://bbs.ichunqi ...
- centOS7 下安装smb服务器
转载自:http://www.cnblogs.com/lgh344902118/p/7503620.html centOS7和windows10 samba是一款可以让linux和windows下共享 ...
- [JavaScript] 将字符串数组转化为整型数组
var dataStr="1,2,3,4,5";//原始字符串 var dataStrArr=dataStr.split(",");//分割成字符串数组 var ...
- nodejs改变代码不需要重启的方法
1.node 搭建本地服务器 在F:/node文件夹下新建app.js const http = require('http'); http.createServer((req, res) => ...
- PHP之旅3 php数组以及遍历数组 以及each() list() foreach()
php的数组的定义 <?php //php中定义数组时可以通过索引直接进行赋值: $mArr[0]="哈哈"; $mArr[1]=70; $mArr[2]='haha'; e ...
- POJ 1147
#include <iostream> #include <algorithm> #define MAXN 3005 using namespace std; int _m[M ...
- POJ 1101
#include <iostream> #include <string> #define MAXN 78 #define min _min #define inf 12345 ...
- 剑指offer三十六之两个链表的第一个公共结点
一.题目 输入两个链表,找出它们的第一个公共结点. 二.思路 如果存在共同节点的话,那么从该节点,两个链表之后的元素都是相同的.也就是说两个链表从尾部往前到某个点,节点都是一样的.我们可以用两个栈分别 ...
- Python运行MapReducer程序时所遇异常
landen@Master:~/UntarFile/hadoop-1.0.4$ bin/hadoop jar contrib/streaming/hadoop-streaming-1.0.4.jar ...