Základy zprostředkovaných služeb
Zprostředkovaná služba je služba získaná prostřednictvím IServiceBrokerrozhraní kompatibilního s RPC, které umožňuje službě a jejímu klientovi existovat v odlišných doménách AppDomains, procesech nebo dokonce napříč počítači (v případě Live Share). Zprostředkovaná služba může být zprostředkovaná z hlavního procesu sady Visual Studio nebo některé z jejích pomocných procesů a mohou ji využívat některé z těchto procesů rozšířením sady Visual Studio.
Další (nezprostředkované) služby sady Visual Studio jsou k dispozici prostřednictvím IServiceProvider rozhraní, jak je popsáno v tématu Používání a poskytování služeb. Tyto služby jsou obvykle dostupné pouze v hlavním procesu sady Visual Studio, ale zpřístupňují větší sadu funkcí než zprostředkované služby.
Rozšíření sady Visual Studio spuštěné na hostu Live Share může poskytovat další funkce tím, že přistupuje k podmnožině těchto služeb, které nabízí hostitel Live Share. Kontroly autorizace platí pro připojení Live Share, aby se zmírnit riziko špatného chování hosta Live Share, který ohrožuje zabezpečení hostitele Live Share. Autoři zprostředkovaných služeb, kteří se rozhodnou zveřejnit své služby přes Live Share, by se měli postarat o implementaci autorizačních kontrol, jak je popsáno v tématu Postup poskytování zprostředkované služby.
Service Broker
Visual Studio má jeden globální IServiceBroker, analogický (a načístelný z) GlobalProvider toho, který zveřejňuje jinou službu. Může se načíst také prostřednictvím mef.
Můžou existovat další kontextové zprostředkovatele služeb, které nabízejí konkrétní funkce sady Visual Studio, které chtějí globální zprostředkovatele agregovat s jedním z vlastních, které nabízejí další služby (nebo možná potlačí některé).
Je IServiceBroker (záměrně) černá skříňka, která klientovi umožňuje získat služby, které mohou být místní, v jiném procesu nebo na jiném počítači. Zprostředkovatelé služeb můžou být agregace jednoho nebo mnoha dalších s použitými zásadami.
V závislosti na kontextu procesu sady Visual Studio je tento globální zprostředkovatel služeb agregací měnící se sady dalších zprostředkovatelů služeb. Kontextové změny v rámci procesu mohou změnit sadu zprostředkovaných služeb, které mohou být aktivovány. Například při načtení řešení může být k dispozici služba související s aktivním řešením. Stejná služba může být dostupná i v zobrazení Otevřít složku, i když s jinou backing implementací. Změna implementace služby by byla pro klienta této služby transparentní, protože obě implementace musí splňovat stejnou smlouvu, ale klient se musí znovu dotazovat na službu v rámci této kontextové změny (z níž by byli upozorněni) AvailabilityChangedk získání nové instance.
Zprostředkovatel služeb se obvykle používá k získání proxy serveru do služby. To znamená, že místo přímého odkazu na objekt služby obdrží klient zástupný kód, který přesměruje všechna volání metody do služby a výsledky nebo výjimky zpět klientovi. Může také předávat události vyvolané službou klientovi. V některých případech může služba podporovat nebo vyžadovat, aby klient nabízí "cílový objekt", kterým může služba vyvolat metody volání zpět klientovi.
Kontejner zprostředkovaných služeb
Aby byly služby k dispozici z globálního systému, musí být vyřaovány do IBrokeredServiceContainer nabídky .IServiceBroker Tento kontejner služby zodpovídá nejen za zveřejnění objektu pro vytváření služeb pro zprostředkovatele služeb, ale také za řízení, kteří klienti mají přístup ke službě, a informovat tyto klienty, když se přístup k této službě změní.
Složení zprostředkované služby
Zprostředkovaná služba se skládá z následujících prvků:
- Rozhraní, které deklaruje funkčnost služby a slouží jako kontrakt mezi službou a jejími klienty.
- Implementace tohoto rozhraní.
- A ServiceMoniker pro přiřazení názvu a verze ke službě.
- A ServiceRpcDescriptor , který v případě potřeby kombinuje ServiceMoniker chování při zpracování RPC.
- Kód pro nabíjení služby
- Registrace služby
Rozhraní služby
Může se jednat o standardní rozhraní .NET (často napsané v jazyce C#). Aby klienti a služby zprostředkované služby existovaly v různých procesech a komunikovaly přes RPC, musí toto rozhraní dodržovat omezení, jak je specifikováno službou ServiceRpcDescriptor , kterou bude vaše služba používat. Tato omezení obvykle zahrnují, že vlastnosti a indexery nejsou povoleny, a většina nebo všechny metody vrací Task nebo jiný asynchronní kompatibilní návratový typ.
Zprostředkované popisovače a popisovače služeb
Aktivace služby vyžaduje znalost jeho monikeru. Protože je moniker zahrnut v popisovači služby, klient se obvykle může zabývat pouze ServiceRpcDescriptor. Popisovač přidává chování nezbytné k nastavení připojení RPC mezi zprostředkovanou službou a jeho klientem nebo v případě potřeby serializovat volání RPC z/z .Stream
Visual Studio doporučuje použít ServiceJsonRpcDescriptor odvozený typ pro zprostředkované služby, které využívají knihovnu StreamJsonRpc, když klient a služba vyžadují rpc ke komunikaci. StreamJsonRpc používá určitá omezení pro rozhraní služby, jak je popsáno zde.
Popisovač se musí používat jen zřídka přímo. Místo toho se obvykle získává z VisualStudioServices knihovny nebo knihovny, která službu nabízí, a pak se používá jako argument pro GetProxyAsync.
Obě třídy ServiceMoniker ServiceJsonRpcDescriptor jsou neměnné, a proto je bezpečné sdílet jako static readonly
pole nebo vlastnosti.
Jakýkoli jiný ServiceRpcDescriptorodvozený typ by měl být neměnný.
A ServiceMoniker je serializovatelný. A ServiceJsonRpcDescriptor není serializovatelné.
Cílová skupina služeb
Každá zprostředkovaná služba je registrována s výběrem příznaků z ServiceAudience. Tyto příznaky určují, kterým klientům a jakým připojením bude zprostředkovaná služba vystavena.
Typickým výběrem je ServiceAudience.Local, který zpřístupňuje službu libovolnému místnímu procesu v rámci relace sady Visual Studio. Při tomto nastavení je služba vždy aktivována místně, i když je aktivní živá sdílená relace.
Po přidání příznaku ServiceAudience.LiveShareGuest získá host Live Share, který požádá o zprostředkovanou službu proxy pro tuto zprostředkovanou službu přes vzdálené připojení k hostiteli Live Share.
Jakákoli kombinace příznaků definovaných podle ServiceAudience předpisů je legální. Příznak LiveShareGuest může být nastaven bez nastavení příznaku Local , například k zveřejnění zprostředkované služby pouze hostům Live Share (z hostitele Live Share) a nikdy být k dispozici místně (kde klient a služba jsou ve stejném procesu).
Příznaky RemoteExclusiveClient jsou RemoteExclusiveServer zastaralé.
Když klient požádá o zprostředkovanou službu, nemusí vědět, co ServiceAudience je pro danou službu nebo kde se služba aktivuje. Služba ale může být užitečná k dokumentaci této hodnoty a pro vývojáře, který službu využívá, aby věděl, kde může být služba aktivována, aby mohla předvídat druh dat, která mohou pocházet z této služby v různých kontextech, a kdy může být služba dostupná.
Složení zprostředkovaného klienta
Když klient požádá zprostředkovanou službu, vrátí se null
buď v případě nedostupnosti služby, ServiceActivationFailedException vyvolá se, pokud služba selže při aktivaci, nebo získá do služby proxy server.
Proxy server se používá bez ohledu na to, jestli je zprostředkovaná služba aktivována ve stejném procesu jako klient nebo jiný.
Tento proxy server pomáhá harmonizovat vzory použití v místních a vzdálených případech služby, aby klient nemusel vědět, kde se služba nachází.