Delen via


Hosting uitbreiden met ServiceHostFactory

De standaard-API ServiceHost voor het hosten van services in Windows Communication Foundation (WCF) is een uitbreidbaarheidspunt in de WCF-architectuur. Gebruikers kunnen hun eigen hostklassen afleiden van ServiceHost, meestal om te overschrijven OnOpening() om standaardeindpunten imperatief toe te ServiceDescription voegen of gedrag te wijzigen, voordat ze de service openen.

In de self-hostomgeving hoeft u geen aangepaste ServiceHost omgeving te maken omdat u de code schrijft waarmee de host wordt geïnstitueert en deze vervolgens aanroept Open() nadat u deze hebt geïnstitueert. Tussen deze twee stappen kunt u alles doen wat u wilt. U kunt bijvoorbeeld een nieuw IServiceBehavior:

public static void Main()  
{  
   ServiceHost host = new ServiceHost( typeof( MyService ) );  
   host.Description.Add( new MyServiceBehavior() );  
   host.Open();  
  
   ...  
}  

Deze methode kan niet opnieuw worden gebruikt. De code die de beschrijving bewerkt, wordt gecodeerd in het hostprogramma (in dit geval de functie Main(), dus het is moeilijk om die logica opnieuw te gebruiken in andere contexten. Er zijn ook andere manieren om een code IServiceBehavior toe te voegen waarvoor geen imperatieve code is vereist. U kunt een kenmerk afleiden van ServiceBehaviorAttribute en dat op uw service-implementatietype plaatsen of u kunt een aangepast gedrag configureren en dynamisch opstellen met behulp van configuratie.

Een kleine variatie in het voorbeeld kan echter ook worden gebruikt om dit probleem op te lossen. Eén benadering is het verplaatsen van de code waarmee de ServiceBehavior uit Main() en naar de OnOpening methode van een aangepaste afgeleide van ServiceHost:

public class DerivedHost : ServiceHost  
{  
   public DerivedHost( Type t, params Uri baseAddresses ) :  
      base( t, baseAddresses ) {}  
  
   public override void OnOpening()  
   {  
  this.Description.Add( new MyServiceBehavior() );  
   }  
}  

Vervolgens kunt u binnenin Main() het volgende gebruiken:

public static void Main()  
{  
   ServiceHost host = new DerivedHost( typeof( MyService ) );  
   host.Open();  
  
   ...  
}  

Nu hebt u de aangepaste logica ingekapseld in een schone abstractie die eenvoudig kan worden hergebruikt in veel verschillende uitvoerbare hostbestanden.

Het is niet onmiddellijk duidelijk hoe u deze aangepaste ServiceHost toepassing gebruikt vanuit Internet Information Services (IIS) of Windows Process Activation Service (WAS). Deze omgevingen verschillen van de self-hostomgeving, omdat de hostingomgeving de omgeving is die de omgeving namens de toepassing instantieert ServiceHost . De IIS- en WAS-hostinginfrastructuur kent niets over uw aangepaste ServiceHost afgeleide infrastructuur.

Het ServiceHostFactory is ontworpen om dit probleem op te lossen van toegang tot uw aangepaste ServiceHost vanuit IIS of WAS. Omdat een aangepaste host die is afgeleid van ServiceHost dynamisch is geconfigureerd en mogelijk van verschillende typen, wordt deze nooit rechtstreeks door de hostingomgeving geïnstitueerd. In plaats daarvan maakt WCF gebruik van een fabriekspatroon om een laag van indirectie te bieden tussen de hostingomgeving en het concrete type van de service. Tenzij u dit anders vertelt, wordt er een standaard-implementatie van ServiceHostFactory gebruikt die een exemplaar van ServiceHost. Maar u kunt ook uw eigen fabriek opgeven die uw afgeleide host retourneert door de CLR-typenaam van uw factory-implementatie in de @ServiceHost richtlijn op te geven.

De bedoeling is dat het implementeren van uw eigen fabriek voor basiscases een eenvoudige oefening moet zijn. Hier volgt bijvoorbeeld een aangepaste waarde ServiceHostFactory die een afgeleide ServiceHostretourneert:

public class DerivedFactory : ServiceHostFactory  
{  
   public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )  
   {  
      return new DerivedHost( t, baseAddresses )  
   }  
}  

Als u deze fabriek wilt gebruiken in plaats van de standaardfactory, geeft u de typenaam in de @ServiceHost instructie als volgt op:

<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>

Hoewel er geen technische limiet is voor wat u wilt ServiceHost doen waarvan u terugkeert CreateServiceHost, raden we u aan uw fabriekimplementaties zo eenvoudig mogelijk te houden. Als u veel aangepaste logica hebt, kunt u deze logica beter in uw host plaatsen in plaats van in de fabriek, zodat deze opnieuw kan worden gebruikt.

Er is nog een laag voor de hosting-API die hier moet worden vermeld. WCF heeft ServiceHostBaseServiceHostFactoryBaseen , van waaruit ServiceHost en ServiceHostFactory respectievelijk afleiden. Deze bestaan voor geavanceerdere scenario's waarbij u grote delen van het metagegevenssysteem moet verwisselen met uw eigen aangepaste creaties.