Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Standardní ServiceHost rozhraní API pro hostování služeb ve Windows Communication Foundation (WCF) je bod rozšiřitelnosti v architektuře WCF. Uživatelé mohou odvodit své vlastní třídy hostitelů ServiceHost, obvykle k přepsání OnOpening(), využití ServiceDescription k přidání výchozích koncových bodů imperativně nebo ke změně chování před otevřením služby.
V prostředí pro samo-hostování nemusíte vytvářet vlastní ServiceHost, protože napíšete kód, který vytvoří instanci hostitele, a potom po vytvoření instance na něj zavoláte Open(). Mezi těmito dvěma kroky můžete dělat, co chcete. Můžete například přidat novou IServiceBehavior:
public static void Main()
{
ServiceHost host = new ServiceHost( typeof( MyService ) );
host.Description.Add( new MyServiceBehavior() );
host.Open();
...
}
Tento přístup není opakovaně použitelný. Kód, který manipuluje s popisem, je kódovaný do hostitelského programu (v tomto případě funkce Main(), takže je obtížné tuto logiku znovu použít v jiných kontextech. Existují také další způsoby přidání IServiceBehavior , které nevyžadují imperativní kód. Můžete odvodit ServiceBehaviorAttribute atribut a dát ho do typu implementace služby, nebo můžete vytvořit vlastní chování konfigurovatelné a vytvořit ho dynamicky pomocí konfigurace.
K vyřešení tohoto problému se ale dá použít i nepatrná variace příkladu. Jedním z přístupů je přesunout kód, který přidává ServiceBehavior z Main() do metody OnOpening vlastní odvozeniny ServiceHost.
public class DerivedHost : ServiceHost
{
public DerivedHost( Type t, params Uri baseAddresses ) :
base( t, baseAddresses ) {}
public override void OnOpening()
{
this.Description.Add( new MyServiceBehavior() );
}
}
Main() Pak uvnitř můžete použít:
public static void Main()
{
ServiceHost host = new DerivedHost( typeof( MyService ) );
host.Open();
...
}
Teď jste zapouzdřeli vlastní logiku do čisté abstrakce, kterou je možné snadno znovu použít v mnoha různých spustitelných souborech hostitele.
Není jasné na první pohled, jak použít tento vlastní ServiceHost ze služby Internet Information Services (IIS) nebo služby Windows Process Activation Service (WAS). Tato prostředí se liší od prostředí hostovaného samotnou aplikací, protože hostitelské prostředí vytváří instanci ServiceHost jménem aplikace. Infrastruktura hostování IIS a WAS nezná nic o vašem vlastním ServiceHost derivátu.
Tento ServiceHostFactory byl navržen k řešení problému s přístupem k vašemu vlastnímu ServiceHost zevnitř služeb IIS nebo WAS. Vzhledem k tomu, že vlastní hostitel odvozený z ServiceHost je dynamicky nakonfigurovaný a potenciálně různého typu, hostitelské prostředí ho nikdy neinstanciuje přímo. Místo toho WCF používá tovární vzor k poskytování vrstvy nepřímé abstrakce mezi hostitelským prostředím a konkrétním typem služby. Pokud ho neřeknete jinak, použije výchozí implementaci ServiceHostFactory , která vrátí instanci ServiceHost. Můžete ale také zadat vlastní továrnu, která vrací odvozený host určením názvu typu CLR implementace vaší továrny v direktivě @ServiceHost.
Záměrem je, že pro základní případy by implementace vlastní továrny měla být jednoduché cvičení. Tady je například vlastní ServiceHostFactory, který vrací odvozené ServiceHost:
public class DerivedFactory : ServiceHostFactory
{
public override ServiceHost CreateServiceHost( Type t, Uri[] baseAddresses )
{
return new DerivedHost( t, baseAddresses )
}
}
Chcete-li použít tuto továrnu místo výchozí továrny, zadejte název typu v direktivě @ServiceHost následujícím způsobem:
<% @ServiceHost Factory="DerivedFactory" Service="MyService" %>
I když neexistuje žádný technický limit pro provádění toho, co chcete vrátit ServiceHost z CreateServiceHost, doporučujeme zachovat implementace vaší továrny co nejjednodušší. Pokud máte spoustu vlastní logiky, je lepší tuto logiku umístit do hostitele místo do továrny, aby ji bylo možné opakovaně použít.
Existuje ještě jedna vrstva rozhraní API pro hostování, která by se zde měla zmínit. WCF také má ServiceHostBase a ServiceHostFactoryBase, ze kterých jsou v uvedeném pořadí odvozeny ServiceHost a ServiceHostFactory. Existují pro pokročilejší scénáře, kdy je nutné nahradit velké části systému metadat vlastními úpravami.