Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A CustomServiceHost-minta bemutatja, hogyan használhatja az osztály egyéni származékát egy ServiceHost szolgáltatás futtatókörnyezeti viselkedésének módosításához. Ez a megközelítés egy újrafelhasználható alternatívát kínál a nagy számú szolgáltatás általános konfigurálására. A minta azt is bemutatja, hogyan használhatja az ServiceHostFactory osztályt egy egyéni ServiceHost használatára az Internet Information Services (IIS) vagy a Windows Folyamataktiválási szolgáltatás (WAS) üzemeltetési környezetében.
A forgatókönyv ismertetése
A potenciálisan bizalmas szolgáltatás metaadatainak véletlen közzétételének megakadályozása érdekében a Windows Communication Foundation (WCF) szolgáltatások alapértelmezett konfigurációja letiltja a metaadatok közzétételét. Ez a viselkedés alapértelmezés szerint biztonságos, de azt is jelenti, hogy nem használhat metaadat-importáló eszközt (például Svcutil.exe) a szolgáltatás hívásához szükséges ügyfélkód létrehozásához, kivéve, ha a szolgáltatás metaadat-közzétételi viselkedése kifejezetten engedélyezve van a konfigurációban.
A metaadatok nagyszámú szolgáltatásban való közzétételének engedélyezéséhez ugyanazokat a konfigurációelemeket kell hozzáadni minden egyes szolgáltatáshoz, ami nagy mennyiségű konfigurációs információt eredményez, amelyek lényegében megegyeznek. Az egyes szolgáltatások egyéni konfigurálásának alternatívájaként meg lehet írni azt az imperatív kódot, amely lehetővé teszi a metaadatok egyszeri közzétételét, majd a kódot több különböző szolgáltatásban újra felhasználhatja. Ez egy új osztály létrehozásával érhető el, amely a ServiceHost osztályból származik, és felülbírálja a ApplyConfiguration() metódust annak érdekében, hogy az imperatív metaadatok közzétételi viselkedését hozzáadja.
Fontos
Az egyértelműség kedvéért ez a minta bemutatja, hogyan hozható létre nem biztonságos metaadat-közzétételi végpont. Ezek a végpontok potenciálisan elérhetők névtelen, hitelesítés nélküli felhasználók számára, és az ilyen végpontok üzembe helyezése előtt ügyelni kell arra, hogy a szolgáltatás metaadatainak nyilvános közzététele megfelelő legyen.
Egyéni ServiceHost implementálása
Az ServiceHost osztály számos hasznos virtuális módszert tesz elérhetővé, amelyeket az öröklők felülbírálhatnak a szolgáltatás futtatókörnyezeti viselkedésének módosítása érdekében. Például a ApplyConfiguration() metódus beolvassa a szolgáltatás konfigurációs adatait a konfigurációs tárolóból, és ennek megfelelően módosítja a gazdagép ServiceDescription. Az alapértelmezett implementáció beolvassa a konfigurációt az alkalmazás konfigurációs fájljából. Az egyéni implementációk felülbírálhatják a ApplyConfiguration() függvényt, hogy imperatív kód segítségével további változtatásokat hajtsanak végre a ServiceDescription-n, vagy akár teljesen helyettesíthetik az alapértelmezett konfigurációs tárolót. Ha például egy szolgáltatás végpontkonfigurációját szeretné beolvasni egy adatbázisból az alkalmazás konfigurációs fájlja helyett.
Ebben a példában egy egyéni ServiceHostot szeretnénk létrehozni, amely hozzáadja a ServiceMetadataBehaviort (amely lehetővé teszi a metaadatok közzétételét), még akkor is, ha ez a viselkedés nem szerepel explicit módon a szolgáltatás konfigurációs fájljában. Ehhez hozzon létre egy új osztályt, amely örökli ServiceHost és felülbírálja ApplyConfiguration().
class SelfDescribingServiceHost : ServiceHost
{
public SelfDescribingServiceHost(Type serviceType, params Uri[] baseAddresses)
: base(serviceType, baseAddresses) { }
//Overriding ApplyConfiguration() allows us to
//alter the ServiceDescription prior to opening
//the service host.
protected override void ApplyConfiguration()
{
//First, we call base.ApplyConfiguration()
//to read any configuration that was provided for
//the service we're hosting. After this call,
//this.Description describes the service
//as it was configured.
base.ApplyConfiguration();
//(rest of implementation elided for clarity)
}
}
Mivel nem szeretnénk figyelmen kívül hagyni az alkalmazás konfigurációs fájljában megadott konfigurációt, a () felülbírálásának első lépése az alap implementáció meghívása ApplyConfiguration. Miután ez a módszer befejeződött, a következő parancsoló kóddal hozzáadhatjuk a ServiceMetadataBehavior-t a leíráshoz.
ServiceMetadataBehavior mexBehavior = this.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (mexBehavior == null)
{
mexBehavior = new ServiceMetadataBehavior();
this.Description.Behaviors.Add(mexBehavior);
}
else
{
//Metadata behavior has already been configured,
//so we do not have any work to do.
return;
}
A ApplyConfiguration() felülbírálás utolsó lépése az alapértelmezett metaadat-végpont hozzáadása. Konvenció szerint a szolgáltatásgazda BaseAddresses-gyűjteményében minden URI-hoz létrejön egy metaadatvégpont.
//Add a metadata endpoint at each base address
//using the "/mex" addressing convention
foreach (Uri baseAddress in this.BaseAddresses)
{
if (baseAddress.Scheme == Uri.UriSchemeHttp)
{
mexBehavior.HttpGetEnabled = true;
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeHttps)
{
mexBehavior.HttpsGetEnabled = true;
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpsBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeNetPipe)
{
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexNamedPipeBinding(),
"mex");
}
else if (baseAddress.Scheme == Uri.UriSchemeNetTcp)
{
this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexTcpBinding(),
"mex");
}
}
Egyéni ServiceHost használata önálló hosztolásban
Most, hogy befejeztük az egyéni ServiceHost-implementációt, használhatjuk azt metaadat-közzétételi viselkedés hozzáadására bármely szolgáltatáshoz, úgy, hogy a szolgáltatást a SelfDescribingServiceHost egy példányában üzemeltetjük. Az alábbi kód bemutatja, hogyan használható az önkiszolgáló forgatókönyvben.
SelfDescribingServiceHost host =
new SelfDescribingServiceHost( typeof( Calculator ) );
host.Open();
Egyéni házigazdánk továbbra is beolvassa a szolgáltatás végpontkonfigurációját az alkalmazás konfigurációs fájljából, mintha az alapértelmezett ServiceHost osztályt használnánk a szolgáltatás üzemeltetéséhez. Mivel azonban hozzáadtuk azt a logikát, amely lehetővé teszi a metaadatok közzétételét az egyéni gazdagépen belül, a továbbiakban nem kell explicit módon engedélyezni a metaadatok közzétételi viselkedését a konfigurációban. Ennek a megközelítésnek külön előnye van, ha több szolgáltatást tartalmazó alkalmazást hoz létre, és engedélyezni szeretné a metaadatok közzétételét mindegyiken anélkül, hogy ugyanazokat a konfigurációelemeket írna újra és újra.
Egyéni ServiceHost használata IIS-ben vagy WAS-ban
Az egyéni szolgáltatás-gazdagép önálló hosztolt forgatókönyvekben való használata egyszerű, mivel végső soron az alkalmazás kódja felelős a szolgáltatásgazdagép példányának létrehozásáért és megnyitásáért. Az IIS vagy WAS üzemeltetési környezetben azonban a WCF-infrastruktúra dinamikusan példányosítja a szolgáltatás gazdagépét a beérkező üzenetekre válaszul. Az egyéni szolgáltatás-gazdagépek ebben az üzemeltetési környezetben is használhatók, de további kódot igényelnek ServiceHostFactory formájában. Az alábbi kód egy ServiceHostFactory származékot mutat be, amely egyéni SelfDescribingServiceHost példányokat ad vissza.
public class SelfDescribingServiceHostFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(Type serviceType,
Uri[] baseAddresses)
{
//All the custom factory does is return a new instance
//of our custom host class. The bulk of the custom logic should
//live in the custom host (as opposed to the factory)
//for maximum
//reuse value outside of the IIS/WAS hosting environment.
return new SelfDescribingServiceHost(serviceType,
baseAddresses);
}
}
Mint látható, az egyéni ServiceHostFactory implementálása egyszerű. Az összes egyéni logika a ServiceHost-implementáción belül található; a gyár visszaadja a származtatott osztály egy példányát.
Ha egyéni gyárat szeretnénk használni egy szolgáltatás-implementációval, hozzá kell adnunk néhány további metaadatot a szolgáltatás .svc fájljához.
<% @ServiceHost Service="Microsoft.ServiceModel.Samples.CalculatorService"
Factory="Microsoft.ServiceModel.Samples.SelfDescribingServiceHostFactory"
language=c# Debug="true" %>
Itt hozzáadtunk egy további Factory attribútumot az @ServiceHost irányelvhez, és az attribútum értékeként átadtuk az egyéni gyár CLR-típusnevét. Amikor az IIS vagy a WAS üzenetet kap ehhez a szolgáltatáshoz, a WCF üzemeltetési infrastruktúrája először létrehozza a ServiceHostFactory példányát, majd maga a szolgáltatásgazdát ServiceHostFactory.CreateServiceHost()-on keresztül indítja el.
A minta futtatása
Bár ez a minta teljes körű ügyfél- és szolgáltatás-implementációt biztosít, a minta célja, hogy bemutassa, hogyan módosíthatja egy szolgáltatás futtatókörnyezetének működését egy egyéni gazdagép használatával. Hajtsa végre a következő lépéseket:
Az egyedi gazdagép hatásának megfigyelése
Nyissa meg a szolgáltatás Web.config fájlját, és figyelje meg, hogy nincs olyan konfiguráció, amely kifejezetten engedélyezi a szolgáltatás metaadatait.
Nyissa meg a szolgáltatás .svc fájlját, és figyelje meg, hogy az @ServiceHost irányelve tartalmaz egy Factory attribútumot, amely megadja egy egyéni ServiceHostFactory nevét.
A minta beállítása, összeállítása és futtatása
Győződjön meg arról, hogy elvégezte a Windows Communication Foundation-minták One-Time beállítási eljárását.
A megoldás létrehozásához kövesse a Windows Communication Foundation-minták készítésére vonatkozó utasításokat.
A megoldás létrehozása után futtassa a Setup.bat a ServiceModelSamples alkalmazás beállításához az IIS 7.0-ban. A ServiceModelSamples könyvtárnak mostantól IIS 7.0-s alkalmazásként kell megjelennie.
Ha a mintát egy vagy több gép közötti konfigurációban szeretné futtatni, kövesse A Windows Communication Foundation-minták futtatásacímű témakör utasításait.
Az IIS 7.0 alkalmazás eltávolításához futtassa aCleanup.bat.