WCF契约

这篇具有很好参考价值的文章主要介绍了WCF契约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

WCF中契约有三种契约:服务契约(Service Contract)、数据契约(Data Contract)、消息契约(Message Contract)。

服务契约(Service Contract)

服务契约描述了暴露给外部的类型(接口和类),服务所支持的操作,使用的消息交换模式和消息的格式。每个WCF服务至少需要实现一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel。服务契约常用的三个特性:ServiceContractAttribute,OperationContractAttribute,MessageParameterAttribute

ServiceContractAttribute

该特性定义在类或接口上,用来描述一个相关操作的集合,该特性有如下一些属性值:

Name:给服务契约定义一个名称,而不是使用接口或是类的类型名,在客户端添加服务引用时会用到

Namespace:命名空间,默认为http://tempuri.org

CallbackContract:将另一个服务契约定义为回调契约,使得客户端可以接收服务端的异步消息

ProtectionLevel:控制契约中发送给消息的保护方式是否需要被签名和加密,值为System.Net.Security.ProtectionLevel枚举

SessionMode:确定会话是否为公开服务契约的端点所支持

ConfigurationName:服务的配置名称

[ServiceContract(Name="TheAge",Namespace="http://test.com" ConfigurationName="IUserService")]

public interface IUser

{}

OperationContractAttribute

被该特性标记的方法即为一个服务操作,使用该特性就可以让一个方法加入到服务契约的操作队列中,可以被客户端所调用,该特性有如下一些属性值:

Name:定义一个操作名称,而不是使用方法名称

Action:该操作消息的动作标题

ReplyAction:响应该操作消息的动作标题

IsOneWay:设置该操作是否单向和没有回复,并且单向操作不支持ReplyAction

ProtectionLevel:允许你控制特定的操作消息是否被保护,操作中的ProtectionLevel属性将覆盖服务契约中的ProtectionLevel,值为System.Net.Security.ProtectionLevel枚举

IsInitiating:操作是否可以用来初始化会话

IsTerminating:操作是否中止一个会话

AsyncPattern:将服务操作定义为异步实现模式

[ServiceContract(Name="TheAge",Namespace="http://test.com" ConfigurationName="IUserService")]

public interface IUser

{

        [OperationContract(Name="oec2003SayHello",

        Action = "http://oec2003.cnblogs.com/IHelloWorldService/Hello",

        ReplyAction = "http://oec2003.cnblogs.com/IHelloWorldService/HelloReply")]

        string SayHi();

}文章来源地址https://www.toymoban.com/news/detail-443462.html

MessageParameterAttribute

该特性可以控制参数或返回值的名称,但该特性对已经用 MessageContractAttribute 特性标记的参数无效,该特性只有一个Name属性

[ServiceContract(Name="TheAge",Namespace="http://test.com" ConfigurationName="IUserService")]

public interface IUser

{

        [OperationContract]

        [return: MessageParameter(Name = "respString")]

        string SayHi([MessageParameter(Name = "string")]string meg);

}

数据契约(Operation Contract)

确定双方沟通时的数据格式,使用数据契约必须引用System.Runtime.Serialization命名空间,在类型上使用DataContractAttribute可以创建数据契约,类型中的成员使用DataMember标记。一旦一个类型被声明为DataContract,那么该类型就可以被序列化并在服务端和客户端之间传送。

只有声明为DataContract的类型的对象可以被传送,且只会传递成员属性,成员方法不会被传递。WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,也就是说,客户端程序不会获得被排除在外的成员的任何信息,包括定义和数据。

并且在默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember。

[DataContract]

public class User

{

        [DataMember]

        public int Age { get; set; }

        [DataMember]

        public string Name { get; set; }

        public string Address{ get; set; }

}

如上代码所示,只会传送Age和Name,Address并不会被传送

数据契约常用的二个特性:DataContractAttribute,DataMemberAttribute

DataContractAttribute

该特性定义在类型之上,类型包括类、结构、枚举但不包括接口。DataContractAttribute特性不能被继承,即继承自有DataContractAttribute特性标记的类并不是数据契约,必须显示使用DataContractAttribute标记才能成为数据契约。该特性有如下一些属性值:

IsReference:bool类型,表示在进行序列化的时候是否保持对象现有的引用结构

Name:名称

Namespace:命名空间

[DataContract(IsReference=true,Name="MyUser",Namespace="http://test.com")]

public class User

{

        [DataMember]

        public int Age { get; set; }

        [DataMember]

        public string Name { get; set; }

        [DataMember]

        public string Address{ get; set; }

}

DataMemberAttribute

被该特性所标记的类型成员才能成为数据契约的数据成员。这个和服务契约中的OperationContractAttribute类似。该特性有如下一些属性值:

EmitDefaultValue:表明在数据成员的值等于默认值的情况下,是否还须要将其序列化到最终的XML中,默认值为true,表示默认值会参与序列化。

IsRequired:bool类型,表明属性成员是否是必须的成员,默认值为false。

Name:数据成员的别名。

Order:相应的数据成员在最终序列化的XML中出现的位置,默认是按字母顺序排列的。

[DataContract(IsReference=true,Name="MyUser",Namespace="http://test.com")]

public class User

{

        [DataMember(EmitDefaultValue=true,IsRequired=true,Name="User_Age",Order=1)]

        public int Age { get; set; }

        [DataMember(EmitDefaultValue = true, IsRequired = true,Name = "User_Name", Order = 2)]

        public string Name { get; set; }

        [DataMember(EmitDefaultValue = true, IsRequired = false,Name = "User_Address", Order = 3)]

        public string Address{ get; set; }

}

消息契约(Message Contract)

使用消息契约必须引用System.ServiceModel命名空间,消息契约和数据契约一样都是定义在数据类型上。和数据契约不同的是消息契约更多的是关注数据成员在SOAP消息中的表示

[MessageContract]

public class MessageTest

{

        [MessageHeader]

        public int Age { get; set; }

        [MessageHeader]

        public string Name { get; set; }

        [MessageBodyMember]

        public string Address{ get; set; }

}

消息契约常用的三个特性:MessageContractAttribute,MessageHeaderAttribute,MessageBodyMemberAttribute

MessageContractAttribute

通过在一个类型上使用MessageContractAttribute标记可以使之成为一个消息契约。该特性有如下一些属性值:

IsWrapped:是否为定义的主体成员(一个或者多个)添加一个额外的根节点

WrapperName:根节点的名称

WrapperNamespace:根节点的命名空间

ProtectionLevel:表示保护级别,WCF中通过System.Net.Security.ProtectionLevel枚举定义消息的保护级别。一般有3种可选的保护级别:None、Sign和EncryptAndSign

[MessageContract(IsWrapped=false,WrapperName="MyMessage",WrapperNamespace="http://test.com")]

public class MessageTest

{}

MessageHeaderAttribute

使用MessageHeaderAttribute标记的数据成员将会出现在SOAP消息的头部,该特性有如下一些属性值:

Actor:为一个URI值,表示处理该报头的目标节点

MustUnderstand:bool类型,表明Actor定义的节点是否必须理解并处理该节点

Name:名称

Namespace:命名空间

ProtectionLevel:表示保护级别

Relay:表明该报头是否需要传递到下一个SOAP节点

[MessageContract]

public class MessageTest

{

        [MessageHeader(Actor="http://test.com/Age",MustUnderstand=true,Name="TheAge",Namespace="http://test.com",Relay=true)]

        public int Age { get; set; }

        [MessageHeader]

        public string Name { get; set; }

}

MessageBodyMemberAttribute

使用MessageHeaderAttribute标记的数据成员将会出现在SOAP消息的主体部分,该特性有如下一些属性值:

Order:Order属性用来控制成员在SOAP主体部分中出现的位置,默认按字母顺序排列

Name:名称

Namespace:命名空间

ProtectionLevel:表示保护级别

[MessageContract(IsWrapped=false,WrapperName="MyMessage",WrapperNamespace="http://oec2003.com")]

public class MessageTest

{

        [MessageBodyMember(Order = 1)]

        public string Email { get; set; }

}

到了这里,关于WCF契约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 固态硬盘、机械硬盘、手机的“内存”有三种

    就是处理器处理文件的地方,相当于的办公桌桌面。可以把所有文件摊开,便于快速处理(速度快,面积有限)。闪存,是真正用来存储文件的地方,相当于办公桌的抽屉,文件可以堆叠(存储量大),装订保存。但每次要查看时,需要从抽屉取出,拿到桌面摊开(速度比内

    2024年02月11日
    浏览(50)
  • Solidity中函数有三种装饰器

    Solidity中函数有三种装饰器,分别是pure、view和payable。使用装饰器可以轻松改变函数的行为。 pure 装饰器 表示在函数中没有修改任何函数以外的变量,包括状态变量,只是单纯地进行了一个数值计算。函数的执行并不会消耗任何Gas,因为函数执行使用的是本地节点的CPU,所以

    2024年02月13日
    浏览(42)
  • 记录--啊?Vue是有三种路由模式的?

    众所周知,vue路由模式常见的有 history 和 hash 模式,但其实还有一种方式- abstract 模式(了解一哈~) 别急,本文我们将重点逐步了解: 路由 + 几种路由模式 + 使用场景 + 思考 + freestyle 路由的本质就是一种对应关系 ,根据不同的URL请求,返回对应不同的资源。那么url地址和真

    2024年02月05日
    浏览(43)
  • 使用maven打包时如何跳过test,有三种方式

    方式一 针对spring项目: 针对springboot:  方式二(通用 ): 方式三(通用): mvn package -DskipTests=true -DskipTests=true,不执行测试用例,但编译测试用例类生成相应的class文件至 target/test-classes 下。   mvn package -Dmaven.test.skip=true -Dmaven.test.skip=true,不执行测试用例,也不编译测试

    2024年02月13日
    浏览(41)
  • 标记垃圾,有三种色彩:四千长文带你深入了解三色标记算法

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:JVM 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您想要的

    2024年02月13日
    浏览(41)
  • 大家都说Java有三种创建线程的方式!并发编程中的惊天骗局!

    在Java中,创建线程是一项非常重要的任务。线程是一种轻量级的子进程,可以并行执行,使得程序的执行效率得到提高。Java提供了多种方式来创建线程,但许多人都认为Java有三种创建线程的方式,它们分别是 继承Thread类、实现Runnable接口和使用线程池。 但是,你们知道吗?

    2024年02月08日
    浏览(71)
  • 荣耀magicbook重装系统后,指纹不能录入的情况,有三种解决办法,完美解决问题。

    有些小伙伴用了很多年的荣耀的笔记本还没坏,但是用着很卡,就想着重装windows系统,系统是重装完了,但是发现指纹录入不上了,就像下面这样,手指放在感应器上也不管用。 本人电脑是2018年买的,已经是过了保修期了,咨询了客服,检测是不需要自己掏钱的,但是如果

    2024年02月02日
    浏览(39)
  • 微服务契约测试框架-Pact

    契约测试的思想就是将原本的 Consumer 与 Provider 间 同步 的 集成测试 ,通过契约进行解耦,变成 Consumer 与 Provider 端两个各自独立的、 异步 的 单元测试 。 契约测试的优点: 契约测试与单元测试以及其它测试之间没有重复,它是单纯验证Provider与Consumer之间按预期的方式交互

    2024年02月15日
    浏览(47)
  • WCF服务应用程序的创建和使用

    1.创建WCF服务应用程序: https://blog.csdn.net/weixin_44690047/article/details/119087706

    2024年02月08日
    浏览(57)
  • 微服务契约测试框架Pact-Python实战

    Pact是一个契约测试框架,有多种语言实现,本文以基于pact-python探究契约测试到底是什么?以及如何实现 官网:自述文件 |契约文档 (pact.io) 1、为消费者写一个单元测试,让它通过,并生成契约文件。 2、在生产者服务执行该契约文件,验证测试是否通过。 官方介绍的是直接

    2024年02月15日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包