1.wcf契约分为:服务契约,操作契约,消息契约、数据契约
-------------------服务契约:
[ServiceContract( Name = "name_IUser", Namespace = "http://localhost:3232/wpf/aa")]
配置元数据交换
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">
</endpoint>//系统内置的数据元数据交换掉的协议;
-------------------操作契约:
[OperationContract(Name = "name_GetName", Action = "http://localhost:3232/wpf/aa/ServiceContract/GetName")]
参数重命名:
void SetName([MessageParameter(Name="")]string name);
返回值重命名
[return:MessageParameter(Name="")]
标记单工通信
[OperationContract(IsOneWay = true)]//默认为false;
-------------------数据契约:
-添加引用:using System.Runtime.Serialization;
[DataContract(Name = "name_DataUser", Namespace = "http://localhost:3232/wpf/aa")]
数据成员:
--数据契约序列化器案例:
Person p = new Person();
p.Name = "郭泽峰";
DataContractSerializer ds = new DataContractSerializer(typeof(Person));
FileStream fs = new FileStream("cc.xml", FileMode.Create);
ds.WriteObject(fs, p);
fs.Close();
[DataMember(Name="name_Name",IsRequired=false,Order=0)]//IsRequired:约束是否必须,order:序列化时的顺序;
为标记的不进行序列化;
1.wcf为了实现soa思想丢失了面向对象的许多特性,比如多态,为了继续使用多态,添加了knowtype(已知类型),在服务中暴露基本类型。标记为派生类并参与序列化;标记后就可以进行里氏替换了;否则转换会剖出异常;
2.在接口上标记已知类型:[serviceKnowType(typeOf())],这样接口里的所有方法声明都可以进行里氏替换;
3.只针对接口中某些特定方法定义的话,加到特定方法声明上就可以了;
-------------------消息契约:为了可以自定义soap格式;header和body;
[MessageContract(IsWrapped=true,ProtectionLevel=ProtectionLevel.Sign)]//消息契约
[messageHeader(ProtectionLevel=ProtectionLevel.EncryptAndSign)]
[messageBodyMember]