Wcf的所有的服务都会公开契约,即描述服务功能的基本方式
Wcf的契约有4种
:服务契约——描述客户端能够执行的服务操作
:数据契约——描述与服务交互的数据类型(int,string隐式定义了契约)
:错误契约——描述服务出错如何处理
:消息契约——允许服务可以直接和消息交互
定义和实现服务契约:
[ServiceContract]//将一个CLR接口映射成一个与技术无关的服务契约
interface IMyContract
{
[OperationContract]
string MyMethod(string text);
}
注意:1:ServiceContract与类型限定无关,类型限定属于clr,所以即使定义为私有的,契约任会公开。以便跨边界调用。只用接口和类可以标记为ServiceContract。即使给类或者接口应用了ServiceContract,并不代表这个类里面的所有方法都是契约,所以需要OperationContract标记
2:服务类的约束:避免使用带参构造函数,因为wcf只能使用默认的构造函数,客户端是无法访问类内部的属性、索引、内部成员的。
3:虽然说ServiceContract可以直接应用到类上,但是我们因为避免这个行为,让他应用在接口上方便不能场景下使用契约。
可以为契约定义命名空间:
[ServiceContract(Namespace= "MyNamespace")],意义与.net的命名空间一样,为了名称避免冲突。契约的默认命名空间为http://tempuri.org,默认情况下契约公开的名字就是接口的名字,但是也可以通过name属性修改名称
托管:
Wcf的每个服务都必须托管在windows的进程中,这个进程我们把他叫做宿主进程,wcf没有要求宿主进程又是客户端进程。
宿主可以由iis提供,可以由windows激活服务提供,甚至可以作为应用程序的一部分
Iis托管:使用iis托管服务的优势是客户端在第一次访问时,自动启动服务,同时可以借助iis管理该服务的生命周期。缺点是只能使用http协议。
自托管:开发者自己提供和管理宿主的生命周期,这样的话就要在客户端调用宿主之前启动宿主