Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La API estándar ServiceHost para hospedar servicios en Windows Communication Foundation (WCF) es un punto de extensibilidad en la arquitectura de WCF. Los usuarios pueden derivar sus propias clases de host de ServiceHost, normalmente para invalidar OnOpening() para usar ServiceDescription para agregar puntos de conexión predeterminados de forma imperativa o modificar comportamientos, antes de abrir el servicio.
En el entorno de autohospedaje, no tiene que crear un ServiceHost personalizado, puesto que escribe el código que crea instancias del host y, a continuación, llama al método Open() en él después de haber creado instancias de él. Entre esos dos pasos puedes hacer lo que quieras. Por ejemplo, podría agregar un nuevo IServiceBehavior:
public static void Main()
{
ServiceHost host = new ServiceHost( typeof( MyService ) );
host.Description.Add( new MyServiceBehavior() );
host.Open();
...
}
Este enfoque no es reutilizable. El código que manipula la descripción se codifica en el programa host (en este caso, la función Main(), por lo que es difícil reutilizar esa lógica en otros contextos. También hay otras formas de agregar un IServiceBehavior que no requieren código imperativo. Puede derivar un atributo de ServiceBehaviorAttribute y colocarlo en el tipo de implementación de su servicio. También puede hacer que un comportamiento personalizado sea configurable y lo componga de manera dinámica mediante la configuración.
Sin embargo, también se puede usar una ligera variación del ejemplo para resolver este problema. Un enfoque es sacar el código que agrega el ServiceBehavior fuera de Main()
y meterlo en el método OnOpening de una derivada personalizada de ServiceHost:
public class DerivedHost : ServiceHost
{
public DerivedHost( Type t, params Uri baseAddresses ) :
base( t, baseAddresses ) {}
public override void OnOpening()
{
this.Description.Add( new MyServiceBehavior() );
}
}
A continuación, dentro de Main()
usted puede usar:
public static void Main()
{
ServiceHost host = new DerivedHost( typeof( MyService ) );
host.Open();
...
}
Ahora ha encapsulado la lógica personalizada en una abstracción limpia que se puede reutilizar con facilidad en muchas aplicaciones ejecutables diferentes de host.
No es inmediatamente obvio cómo utilizar este elemento personalizado ServiceHost desde dentro de Internet Information Services (IIS) o Windows Process Activation Service (WAS). Esos entornos son diferentes del entorno de autohospedaje, ya que el entorno de hospedaje es el que crea instancias de ServiceHost en nombre de la aplicación. La infraestructura de hospedaje de IIS y WAS no sabe nada sobre su derivado personalizado ServiceHost .
ServiceHostFactory se diseñó para resolver este problema de tener acceso a su ServiceHost personalizado desde dentro de IIS o WAS. Dado que un host personalizado derivado de ServiceHost se configura dinámicamente y potencialmente de varios tipos, el entorno de hospedaje nunca lo crea directamente. En su lugar, WCF usa un patrón de fábrica para proporcionar una capa de direccionamiento indirecto entre el entorno de hospedaje y el tipo concreto del servicio. A menos que se le indique lo contrario, usa una implementación predeterminada de ServiceHostFactory que devuelve una instancia de ServiceHost. No obstante, también puede proporcionar su propio generador que devuelva el host derivado mediante la especificación del nombre de tipo de CLR de la implementación del generador en la directiva @ServiceHost.
La intención es que, para los casos básicos, implementar tu propia fábrica sea un ejercicio sencillo. Por ejemplo, aquí hay un ServiceHostFactory personalizado que devuelve un ServiceHost derivado:
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new DerivedHost( t, baseAddresses )
}
}
Para usar esta factoría en lugar de la factoría predeterminada, proporcione el nombre de tipo en la @ServiceHost directiva como se indica a continuación:
<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>
Mientras no haya ningún límite técnico para hacer lo que desea al ServiceHost que devuelve desde CreateServiceHost, sugerimos que mantenga sus implementaciones de generador lo más simple posible. Si tiene una gran cantidad de lógica personalizada, es mejor colocar esa lógica dentro del host en lugar de dentro de la fábrica para que pueda ser reutilizable.
Hay una capa más para la API de hospedaje que se debe mencionar aquí. WCF también tiene ServiceHostBase y ServiceHostFactoryBase, del que ServiceHost y ServiceHostFactory se derivan respectivamente. Existen para escenarios más avanzados en los que debe intercambiar partes grandes del sistema de metadatos con sus propias creaciones personalizadas.