[WCF学习笔记] Hosting
SOA Service 服务的特点:
- 服务是平台和位置无关的。
- 服务是相互隔离的。一个服务的改变不会要求其他服务的改变。
- 服务是通信协议、格式、传输中性的,灵活的。
- 服务是可扩展的。
- 服务行为不是限死的,而是策略可更改和配置的。
WCF的推出背景:
- .NET Remoting: .NET Remoting 提供了一种很有用的方法,用于管理跨应用程序域的同步和异步 RPC 会话,是替代DCOM的实现分布式应用的方案。是微软较为成熟的.net平台下实现分布式应用的解决方案(一般来说,remoting是和平台相关的,需要客户和服务器都是.NET)。当然,.net remoting的宿主Hosting可以是console程序、Winform程序,也可以是IIS,也就是Web service。.net remoting除了支持http和TCP外,还可以通过自定义传输协议来进行传输通信。但.net remoting实际上更适合Intranet而不是Internet,因为.net remoting 是MarshByReference的,可以传变量的引用,直接对服务器对象操作。速度快。而web service 是MarshByValue的,必须传对象的值。速度慢,但可以穿透防火墙。
- XML Web Serivce:平台无关,能穿透防火墙,Web Serivce是标准。 分几个层次:Http传输、Xml数据格式、SOAP协议封装、WSDL描述、UDDI发布。
- MSMQ: 用于创建可靠的、分布式、松散连接的、基于消息通讯的应用程序的开发工具。
Hosting :
和.net Remoting一样,继承自System.MarshalByRefObject 的对象必须Host到某一个运行的进程中,他才开始监听来自Client端的请求,当Client才能通过Proxy远程的调用,Remoting Infrastructure监听到来自Client端的请求,他会激活相应的remote Object(我们只考虑Server Activate Object——SAO)。实际上对于WCF Service也需要一个Host环境才有其发挥作用的舞台。就像Remoting一样,你可以使用任何一种Managed Application——Console Application、WinForm Application、IIS / ASP.NET Application——作为它的Host环境。
在WCF架构图中可以看到,Activation and Hosting层提供了使得服务可以在哪儿启动和宿主的服务。 Service可以宿主在其他应用的上下文之中,也可以self-hosted.
- Windows Activation Service:在有运行Windows ActivationService的计算机中,WCF应用可以自动启动.
- EXE: WCF允许服务以可执行文件运行(.EXE files),例如Winforms,console applications
- Windows Services: WCF允许服务以Windows服务运行.
- COM+: WCF允许服务以COM+应用运行.
Hosting, which means that you will use a built-in hosting environment such as IIS
在hosted环境中,开发人员不必创建host应用,因为WCF服务宿主在IIS中。IIS管理和控制服务的生命周期,包括句柄的创建和释放(内存释放,系统资源的释放等)。尽管开发人员不必创建host应用,但是开发人员需要创建目录结构和服务宿主的虚拟目录。hosted服务的好处是可以利用IIS来监控服务的稳定性,而且可以自动启动。
Self-Hosting, which means that you will build the host environment yourself
开发人员需要手动创建服务宿主的环境,来负责服务的创建和生命周期,并对服务的所有方面进行控制。例如,定义Endpoint(或通过configuration),创建ServiceHost等。host应用通过ServiceHost类控制服务句柄的创建和释放,使用Open方法来启动消息收取,使用Close方法来停止和释放服务。这种方法提供更多的灵活性。
Host在托管代码中(例如WinForm applications,console applications, Windows service),部署起来代价更小,灵活性更强
ServiceHost sh;
List<ServiceHost> shs = new List<ServiceHost>();
private void Form1_Load(object sender, EventArgs e)
{
sh = new ServiceHost(typeof(WCFService.ServiceClass));
sh.Open(); // Open host, --- use sh.Close() to close host
}
Links: