常常需要与宿主实例进行交互。这对于使用自托管的方式是不可或缺的。当使用IIS或WAS时,不能直接访问宿主。为了克服这个障碍,WCF提供了一个宿主工厂。在.svc文件中使用Factory标签,使用此工厂,而不使用默认工厂:
<%@ ServiceHost Language = "C#" Debug = "true" CodeBehind = "~/App_Code/MyService.cs" Service = "MyService" Factory = "MyServiceFactory" %>
当不显示使用.svc文件时,也可以在配置文件中指定宿主工厂:
“<serviceActivations> <add relativeAddress = "MyService.svc" service = "MyService" factory = "MyServiceFactory" /> </serviceActivations>” 摘录来自: Juval Löwy and Michael Montgomery. “Programming WCF Services”。 iBooks.
自定义宿主工厂类必须继承自ServiceHostFactory类并重写虚方法CreateServiceHost():
“public class ServiceHostFactory : ... { protected virtual ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses); //More members }” 摘录来自: Juval Löwy and Michael Montgomery. “Programming WCF Services”。 iBooks.
例如:
“class MyServiceFactory : ServiceHostFactory { protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { ServiceHost host = new ServiceHost(serviceType,baseAddresses); //Custom steps here return host; } }” 摘录来自: Juval Löwy and Michael Montgomery. “Programming WCF Services”。 iBooks.
CreateServiceHost()方法其实就相当于IIS或WAS托管服务的Main()方法,你可以以这样的目的来使用它。
尽管对于从 CreateServiceHost 返回的 ServiceHost 可以执行什么操作没有技术限制,但建议您尽可能使工厂实现简单化。如果有大量的自定义逻辑,最好将这些逻辑放入宿主内而不是工厂内,以便可以重用它们。
参考:
Juval Löwy and Michael Montgomery. “Programming WCF Services”
使用 ServiceHostFactory 扩展宿主(https://msdn.microsoft.com/zh-cn/library/aa702697.aspx)