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; }文章来源:https://www.toymoban.com/news/detail-443462.html
}
到了这里,关于WCF契约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!