WCF第一要素就是契约:

服务契约用于声明可用于远程访问的类型。在Interface或class开始处使用服务契约标签.

[ServiceContract]

Public interface Iservice

{

}

接口调用契约的好处:

1.       同一服务类型可以实现多个不相干的服务契约.

2.       有利于版本升级

3.       按照接口隔离原则,让开发人员可以随时修改服务契约.

服务契约的属性与作用:

Name/Namespace定义该服务契约的自定义名称和命名空间,它会反映到WSDL及客户端的导出类中

ConfigurationName设置信息在配置文件中的名称。默认情况下为类的全名(本例为“WCFDemo.IService”)。

SessionMode服务契约的会话方式,允许的值有Allowed、NotAllowed和Required。默认为Allowed值。

CallbackContract设置双工通信时(Duplex)的回调类型。

ProtectionLevel指定消息保护模式,可以对通信的消息进行加密及签名。

使用参数时,例如要指定自定义的Name和 Namespace,可以编写如下的代码。

[ServiceContract(Name=”MyService”,Namespace=”http://microsoft.com/wcf/demo”)]

Interface IService{}

定义为服务契约的接口或类的方法可以被声明为OperationContract(操作契约),只有声明为操 作契约的方法才可以被远程调用

[ServiceContract]

Public interface Iservice

{

[OperationContract]

String SayHello(string name);

}

错误契约(FaultContract)

被标识为FaultContract的方法必须同时已经被声明为OperationContract,否则就没有什么意义。声明一个方法为 FaultContract并指定了响应的类型参数以后,当调用这个方法时产生错误时,就会有一个对应SOAP格式的错误消息返回给调用端

[DataContract]

public class UserFault //自定义错误类

{

[DataMember]

public string Message { get; set; }

[DataMember]

public int UserId { get; set; }

public UserFault(int userId, string msg)

{

this.UserId = userId;

this.Message = msg;

}

}

[ServiceContract]

public interface IUserService

{

[OperationContract]

[FaultContract(typeof(UserFault))]

UserInfo GetUser(int id);

}

public UserInfo GetUser(int id)

{

try{

UserInfo info = new UserInfo();

info.Age = 16;

info.UserName = "陈翔";

return info;

}

catch (Exception e)

{

throw new FaultException<UserFault>(new UserFault(id, e.Message));

}

}

数据契约(DataContract)

[DataContract]

public partial class Userinfo

{

private string _xsid = String.Empty;

/// <summary>

/// 学生编号

/// </summary>

[DataMember(Name="xsid")]

public string Xsid

{

get { return _xsid; }

set { _xsid = value; }

}

}

服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型。

一个类如果声明了DataContract类型,说明类是可以被传送的,且只有成员属性可以被传送.支持Name/Namespace属性[DataContract(Name=”Name”)]

每一个要传送的成员声明为DataMember类型,同样也可以包含Name,Namespace,IsRequired,Order,EmitDefaultvalue属性

需要传送SOAP消息时可以使用[MessageContract] eg:

[MessageContract]

public partial class Userinfo

{

private string _xsid = String.Empty;

private string _njid = String.Empty;

/// <summary>

/// 学生编号

/// </summary>

[MessageBodyMember(

Name="xsid"

Namespace=”http://www.smodi.com”)]

public string Xsid

{

get { return _xsid; }

set { _xsid = value; }

}

/// <summary>

/// 年级编号

/// </summary>

[MessageHeader(

Name="njid"

Namespace=”http://www.smodi.com”)]

public string Njid

{

get { return _njid; }

set { _njid = value; }

}

}

这个可以生成SOAP消息

<s:Envelope>

<s:Header>

<a:Action s:mustUnderstand="1">http:// Userinfo /Action</a:Action>

<h:AuthKey s:mustUnderstand="1" xmlns:h="http://www.smodi.com">xxxx</h:AuthKey>

</s:Header>

<s:Body>

<UserMessage xmlns="Microsoft.WCF.Documentation">

<User xmlns="http://www.smodi.com">abcd</User>

</UserMessage>

</s:Body>

</s:Envelope>

转载于:https://www.cnblogs.com/chenqingwei/archive/2010/06/09/1754513.html

数据契约(DataContract)相关推荐

  1. WCF学习(五)数据契约之已知类型

    准备技术: 1.C#基础知识 2.了解WCF基础知识 在正常的c#开发中我们是允许用子类去替换基类的,这也是所谓的替换原则.但是我们在WCF中确不能用数据契约的子类来替换父类的,因为这中间存在一个序列 ...

  2. 关于数据契约(DataContract)待续

    前两天做程序时建一个类来要实例化一些数据的处理时遇到的一个问题, 人懒了一下,就复制了以前的一部分代码,由于漏掉了DataContract的服务契约,程序执行时报错. 虽然找到错在哪,但对于DataC ...

  3. 03 数据契约_03 数据契约层级(DataContract Hierarchy)

    数据契约层级(DataContract Hierarchy) 已知类型 大多数情况下,WCF不能使用数据契约的子类去替换基类 解决上述问题--KnownTypeAttribute 服务已知类型 弥补K ...

  4. WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)

    [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]在.NET中,所有的集合都实现了IEnumerable接口,比如Arra ...

  5. WCF步步为营(五):数据契约

    . WCF只能传输序列化的类型,WCF 能自动序列化.net内置的之类型,但是如果需要传输自定义的类型,必须把自定义的类型标注DataContract DataContract标注这个类作为数据契约, ...

  6. WCF契约的简单介绍(服务契约 数据契约 消息契约)

    本篇博文只是简单说下WCF中的契约的种类.作用以及一些简单的代码示例.在WCF中契约分为服务契约.数据契约和消息契约.下面对这几种契约进行简单的介绍. 服务契约 服务契约描述了暴露给外部的类型(接口或 ...

  7. json知识中的数据契约

    数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被 ...

  8. 第七讲:数据契约(2)

    代码 https://yunpan.cn/cPns5DkGnRGNs   密码:3913 前面不止一次地强调,WCF下的序列化与反序列化解决的是数据在两种状态之间 相互 转化的问题:托管类型对象转换成 ...

  9. WCF 之 数据契约

    前面几篇讲的都只能传递string类型的简单参数,数据契约就是用来解决如传递一个带有多个属性的Class类型的对象的. WCF推荐使用数据契约的方式实现数据的序列化.这部分的内容很好理解但是很重要,先 ...

最新文章

  1. Linux 系统安装MySQL
  2. appweb ejs_具有快速路线的EJS
  3. C语言课程设计火车订票系统存储结构设计,火车售票系统(数据结构课设)
  4. java 文件无法下载_无法从Java中的URL下载文件
  5. [JavaScript]自定义MessageBox
  6. 1337. 矩阵中战斗力最弱的 K 行
  7. What is “Deploy applications configured in Tomcat instance” in IntelliJidea
  8. MATLAB车道识别与交通标志识别
  9. Pazera Free MP4 To MP3 Converter 1.6 中文64位+32位便携版,免费的视频转换器
  10. 蓝天模具风扇调速软件_联力UNI FAN SL120风扇体验:模组化拼装的风扇
  11. 数学模型——数学与人类文明的桥梁
  12. 复杂网络盘传播搜索关键字
  13. 于是,我搭了个自己的博客网站
  14. 【C#】字体增大、减小、改变颜色
  15. js html 编辑器添加图片不显示,彻底解决ewebeditor网站后台不能上传图片的方法
  16. Java-数据结构:树,这份资料可帮你解决95%的问题
  17. Java基础之四大核心函数式接口简单使用
  18. COTS应用程序开发框架简介(二)
  19. 学习笔记-用PLAN法提高执行力
  20. 计算机三级网络技术最全知识点总结【7】

热门文章

  1. 远程连接mysql数据库注意点记录
  2. Codeforces 821C - Okabe and Boxes
  3. 初学React,setState后获取到的thisstate没变,还是初始state?
  4. 通过PowerShell获取Windows系统密码Hash
  5. 发布IP地址查询的WEB SERVICE
  6. 中国如何引进CMM评估,促进软件产业发展
  7. ANSYS——相同模型不同创建方式的同载荷同约束下的比较
  8. python数据结构_(列表)大O性能_学习笔记(2)
  9. python从date目录导入数据集_使用python划分数据集
  10. c++显式加载dll并使用DLL的类