WCF中的宿主是一个非常重要的内容。对于初学者来说,可能对此的理解掌握并不是太容易。我们将会在这篇文章中通过低WCF自宿主的解读,来让大家进一步的对WCF宿主的内容有一个深入了解。#t#
WCF自宿主是当开发者负责提供和管理宿主进程的生命周期时使用的技术名词。自宿主被应用在位于客户端和服务之间的一个进程(或计算机)边界环境中,以及当使用进程中服务的情况下(也就是说,与客户端处于相同的进程中)。你需要提供的进程可能是任何Windows进程,例如,一个Windows表单应用程序,一个控制台应用程序或一个Windows NT服务。注意,该进程必须在客户端调用服务之前先运行起来;典型情况下,这意味着,你必须预先启动它。对于NT进程中服务来说这并不是一个问题。
类似于IIS宿主,WCF自宿主应用程序配置文件必须列出你想宿主的服务的类型并且暴露给外界。而且,该宿主进程必须在运行时刻显式地注册服务类型并且打开该宿主以便于客户端调用。典型地,这是在Main()方法中使用如下定义的助理类ServiceHost实现的:
- public interface ICommunicationObject : IDisposable
- {
- void Open();
- void Close();
- //更多成员
- }
- public abstract class CommunicationObject :
- ICommunicationObject
- {...}
- public class ServiceHostBase : CommunicationObject,...
- {...}
- public class ServiceHost : ServiceHostBase,...
- {
- public ServiceHost(Type serviceType,
- params Uri[]baseAddresses);
- //更多成员
- }
提供给ServiceHost的构造函数的信息有:服务类型和(可选)默认的基地址。该基地址集可以是一个空集(以后,你可以配置不同的基地址)。拥有一组基地址能够使服务接受在多个地址和协议上的调用。注意,每个ServiceHost实例都关联与一个特定的服务类型,并且如果宿主进程需要宿主多个类型的服务的话,你需要一些匹配的ServiceHost实例。通过调用宿主中的ServiceHost.Open()方法,你允许调入(call- in);并且通过调用ServiceHost.Close()方法,你可以体面地退出宿主实例并完成到当前客户端的数据发送,并且还要拒绝未来的客户端调用-即使宿主进程仍在运行中。典型地,关闭操作是在宿主进程关闭时实现的。例如,为了把这个服务宿主在一个Windows表单应用程序中:
- [ServiceContract]
- interface IMyContract
- {...}
- class MyService : IMyContract
- {...}
- 你可以编写:
- public static void Main()
- {
- Uri baseAddress = new Uri("http://localhost:8000/");
- ServiceHost serviceHost;
- serviceHost = new ServiceHost(typeof(MyService),baseAddress);
- serviceHost.Open();
- //能够拦截调用:
- Application.Run(new MyForm());
- serviceHost.Close();
- }
注意,你可以在调用ServiceHost.Open()之后拦截调用,因为该宿主接收在工作者线程上的所有调用。对ServiceHost.Open()的调用将加载WCF运行时刻并且支持接收客户端调用。该宿主能注册多个基地址,只要它们至少在传输方面存在不同:
- Uri tcpBaseAddress = new Uri("net.tcp://localhost:8001/");
- Uri httpBaseAddress = new Uri("http://localhost:8002/");
- ServiceHost serviceHost = new ServiceHost(typeof(MyService),
tcpBaseAddress,httpBaseAddress);
通过从"Add New Item"对话框中选择WCF服务,Visual Studio 2005允许你把一个WCF服务添加到任何应用程序工程。以此方式添加的服务当然是进程中服务(相对于宿主进程来说),但是也可以由外部客户端存取。
以上就是对WCF自宿主的全部介绍。