Quando utilizamos o IIS como host de um serviço WCF, o módulo em conjunto com o handler do WCF (referentes ao ASP.NET pipeline) se encarregam de criar a classe ServiceHost no momento correto, utilizado para servir o tipo que queremos disponibilizar para que os clientes consumam.
Como a criação deste objeto acontece automaticamente, pode haver cenário onde é necessário fazer um trabalho adicional durante a criação do mesmo e, para isso, podemos criar uma classe que herde diretamente da classe ServiceHost e lá interceptar e, conseqüentemente, customizar o que desejamos:
public class CustomServiceHost : ServiceHost {
public CustomServiceHost(){
ExecuteCustomAction();
}
}
Só que apenas isso não é o suficiente. Ainda é necessário implementarmos uma factory que cria a instancia da classe acima. Dentro do WCF existe a classe ServiceHostFactoryBase que é encarregada de criar instancias das classes ServiceHost para o módulo. Neste momento, quando herdamos desta classe base, devemos sobrescrever o método CreateServiceHost que, no nosso cenário, deverá retornar uma instancia de CustomServiceHost. O exemplo abaixo demonstra esse processo:
public class CustomServiceHostFactory : ServiceHostFactoryBase {
public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses){
return new CustomServiceHost(baseAddresses);
}
}
Finalmente, o código acima por si só não trabalha. Ainda é necessário especificarmos a factory que será utilizada para a geração do host e, para isso, utilizamos o atributo Factory da diretiva @ServiceHost do arquivo *.svc onde atribuímos o tipo (Type) da a factory recém criada. O trecho do código abaixo exibe o arquivo *.svc com a factory que customizamos acima já definida:
<%@ServiceHost language=”C#” Factory=”CustomServiceHostFactory” %>