(1)服务契约定义了远程访问对象和可供调用的方法
https://cloud.tencent.com/info/f18072c00f0f7a85b5dea3c66771fe1c.html
ServiceContract特性允许应用到接口或类上。当接口应用了ServiceContract特性后,需要定义类实现该接口
然后使用一个或多个类(或接口)方法中的 OperationContract 属性定义协定的服务操作
通俗的说,给一个类或者是接口打上ServiceContract属性标签,表名了客户端可以调用接口或类的内部打上了OperationContract
特性标签的方法.
Name 和 Namespace 属性控制 WSDL 元素中的协定名称和命名空间。
例如:
[ServiceContract]
interface IMyContract
{
[OperationContract]
string MyMethod();
}
class MyService : IMyContract
{
public string MyMethod()
{
return "Hello WCF";
}
}
(2)数据契约:数据契约则是服务端和客户端之间要传送的自定义数据类型。
https://www.cnblogs.com/likui-bookHouse/p/8310225.html
一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送。
只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。
WCF对声明为DataContract的类型提供更加细节的控制,可以把一个成员排除在序列化范围以外,
也就是说,客户端程序不会获得被排除在外的成员的任何信息
,包括定义和数据。默认情况下,所有的成员属性都被排除在外,
因此需要把每一个要传送的成员声明为DataMember,如下所示。
[DataContract]
public class UserInfo
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public int Age { get; set; }
[DataMember]
public string Location { get; set; }
public string Zodiac { get; set; }
}
上面这段代码把UserInfo类声明为DataContract,将UserName、Age、Location这3个属性声明为DataMember(数据成员)。Zodiac成员没有被声明为DataMember,因此在交换数据时,不会传输Zodiac的任何信息
声明为DataMember的成员也可以自定义客户端可见的名称
除了Name和Namespace以外,DataMember还有以下参数,它们的含义分别如下。
(1)IsRequired:值为true时,要求序列化引擎检查对象是否存在该值;若无,则会有异常抛出。
(2)Order:bool类型值,值为true时,序列化和反序列化过程将会按成员定义的顺序进行,这对依赖于成员位置的反序列化过程无比重要。
(3)EmitDefaultvalue:为成员属性设置一个默认值。
(4)JsonProperty: 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把trueName属性序列化为name