WCF
WCF属于SOAP范畴,用于通信
契约
契约在服务端和客户端都需要引用
- 服务契约(接口)
[ServiceContract]
Interface IService {
[OperationContract]
方法声明();
……
}
- 数据契约
数据契约特性只能用于类、枚举、结构体,但是不能用于接口DataContract没有继承性
[DataContract]
Class Model {
[DataMember]
属性;
……
}
服务端
- 配置文件
<system.ServiceModel>
<services>
<service name=”命名空间.实现服务契约的类名” behaviorConfiguration=”serviceBehaviors”>
<host>
<baseAddresses>
<add baseAddress=”http://IP:端口号/路径名”/>
</baseAddresses>
</host>
<endpoint address=”路径名”(可以省略?) binding=”basicHttpBinding” contract=” 命名空间.服务契约接口名” />
<endpoint ……>
……
</service>
<service ……/> //多个服务基地址的IP和端口号可以相同,但路径名要有所不同
</services>
<behaviors ……/>
<bindings> //服务端客户端保持一致
<basicHttpBinding>
<bingding closeTimeout=”00:10:00” receiveTimeout=”00:20:00” sendTimeout=”00:20:00” maxBufferSize=”2147483647” maxReceiveMessageSize=” 2147483647” />
</basicHttpBinding>
</bindings>
</system.ServiceModel>
- 主程序
ServiceHost host = new ServiceHost(typeof(服务契约实现类))
Host.Opened += deleate{Console.WriteLine(“服务已启动”); }
Host.Open();
客户端
- 配置文件
<system.ServiceModel>
<bindings> //服务端客户端保持一致
<basicHttpBinding>
<bingding closeTimeout=”00:10:00” receiveTimeout=”00:20:00” sendTimeout=”00:20:00” maxBufferSize=”2147483647” maxReceiveMessageSize=” 2147483647” />
</basicHttpBinding>
</bindings>
<client>
<endpoint name=”” address=”http//IP:端口号/全路径” binding=”basicHttpBinding” contract=”命名空间.服务契约接口名” />
<endpoint ……>
……
</client>
</system.ServiceModel>
- 获取代理
- 通道工厂方式
ChannelFactory<服务契约(接口名)> cf = new ChannelFactory<服务契约(接口名)>(终结点名称)
服务契约(接口名) proxy = cf.CreateChannel();
WCF中实现多态
- 使用接口作为参数
在[ServiceContract]后添加[ServiceKnowType(typeof(实现接口的类名))]
- 使用父类作为参数
父类子类都要有[DataContract],父类上添加[KnownType(typeof(子类名))]