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对请求的数据格式更为严格 ...
随机推荐
- Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Table 'mysql.plugin' doesn't exist
问题:在linux上安装mysql的时候出现Plugin ‘FEDERATED’ is disabled. /usr/sbin/mysqld: Table ‘mysql.plugin’ doesn’t ...
- C/C++ 语言 Hello world
#include <stdio.h> void main() { int x,i; ; scanf("%d",&x); if(x>y) printf(&q ...
- 基于jeesite+android开发 电子商务系统免费教程
下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...
- Alamofire源码导读四:统计信息
 时间顺序如上图: self.latency = initialResponseTime - requestStartTime self.requestDuration = requestCompl ...
- 添加新内容的四个 jQuery 方法:append,prepend,after,before
添加新内容的四个 jQuery 方法区别如下: append() - 在被选元素(里面)的结尾插入内容prepend() - 在被选元素(里面)的开头插入内容 //jQuery append() 方法 ...
- 删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库
检查状态,看看发生了什么:$ git statusOn branch masterChanged but not updated:(use "git add/rm <file>. ...
- ELK日志系统之使用Rsyslog快速方便的收集Nginx日志
常规的日志收集方案中Client端都需要额外安装一个Agent来收集日志,例如logstash.filebeat等,额外的程序也就意味着环境的复杂,资源的占用,有没有一种方式是不需要额外安装程序就能实 ...
- Java 注解实例
package com.annotation; import java.lang.annotation.Retention; import java.lang.annotation.Target; i ...
- (技术分享) 解决 Firefox 显示“已阻止载入混合活动内容”的问题
(摘自http://blog.aizhet.com/Windows/18415.html) 从 Firefox 18 开始,如果 HTTPS 页面中包含非加密的 HTTP 内容,浏览器会在控制台输出警 ...
- [Codeforces Round#488]Div.2
总结 这是我无聊透顶肝到三点半的一场 cf ,结果还真够无聊的 这套题涵盖了英语题,语文题,模拟题.注重考查了选手的英语素养能力,语文阅读能力和精湛的模拟和枚举能力.是不可多得的一套好题. 没什么单独 ...