Delen via


Essentials van bemiddelde diensten

Een brokered service is een service die is verkregen via een IServiceBroker, en wordt weergegeven als een RPC-compatibele interface om de service en de client in afzonderlijke AppDomains, processen of zelfs op meerdere computers te laten bestaan (in het geval van Live Share). De geïntegreerde service kan worden aangeboden vanuit het hoofd-Visual Studio-proces of een van de ondersteunende processen, en kan worden geconsumeerd door elk van deze processen via een Visual Studio-extensie.

Meer (niet-brokered) Visual Studio-services zijn beschikbaar via de IServiceProvider interface, zoals beschreven in Using and Providing Services. Dergelijke services zijn doorgaans alleen beschikbaar in het belangrijkste Visual Studio-proces, maar bieden een grotere set functionaliteit dan brokered services.

Een Visual Studio-extensie die wordt uitgevoerd op een Live Share-gast kan extra functionaliteit bieden door toegang te krijgen tot een subset van deze services, zoals opgegeven door de Live Share-host. Autorisatiecontroles zijn van toepassing op Live Share-verbindingen om het risico te beperken dat een gast tijdens Live Share die zich misdraagt, de beveiliging van de Live Share-host kan compromitteren. Auteurs van brokered services die ervoor kiezen om hun services beschikbaar te maken via Live Share, moeten ervoor zorgen dat autorisatiecontroles worden geïmplementeerd, zoals beschreven in Hoe een brokered service te bieden.

Service-bemiddelaar

Visual Studio heeft één globale IServiceBroker, vergelijkbaar met (en ophaalbaar van) de GlobalProvider waarmee andere services toegankelijk worden. Het kan ook worden opgehaald via MEF.

Er kunnen andere, meer contextspecifieke servicebrokers zijn die worden aangeboden door specifieke Visual Studio-functies. Deze willen de globale servicebroker samenvoegen met een van hun eigen brokers, die aanvullende services biedt of mogelijk bepaalde services onderdrukt.

Een IServiceBroker is (opzettelijk) een zwarte doos waarmee een client services kan ophalen die lokaal, in een ander proces of op een andere computer kunnen zijn. Servicebrokers kunnen aggregaties zijn van een of meer andere, waarbij beleidsregels worden toegepast.

Op basis van de context waarin het Visual Studio-proces zich bevindt, is deze globale servicebroker een aggregaties van een veranderende set andere servicebrokers. Contextwijzigingen binnen het proces kunnen de reeks bemiddelde diensten beïnvloeden die geactiveerd kunnen worden. Wanneer een oplossing bijvoorbeeld wordt geladen, kan er een service beschikbaar komen die specifiek is gerelateerd aan de actieve oplossing. Dezelfde service kan ook beschikbaar zijn in een weergave 'Open map', zij het met een andere achterliggende implementatie. De wijziging in de implementatie van de service zou transparant zijn voor een client van die service, omdat beide implementaties aan hetzelfde contract moeten voldoen, maar de client moet opnieuw een query uitvoeren voor de service in deze contextwijziging, waarover ze via een melding worden geïnformeerd via AvailabilityChanged, om de nieuwe instantie op te halen.

De servicebroker wordt doorgaans gebruikt om een proxy voor de service te verkrijgen. In plaats van rechtstreeks een verwijzing naar het serviceobject te ontvangen, ontvangt de client een stub die alle methode-aanroepen naar de service en resultaten of uitzonderingen terugstuurt naar de client. Het kan ook gebeurtenissen doorsturen die door de service zijn gegenereerd naar de client. In sommige gevallen kan een service ondersteuning bieden of vereisen dat de client een 'doelobject' aanbiedt waarmee de service methoden kan aanroepen om terug te bellen naar de client.

Bemiddelde servicecontainer

Services moeten worden aangeboden in het IBrokeredServiceContainer om beschikbaar te zijn vanuit de wereldwijde IServiceBroker. Deze servicecontainer is niet alleen verantwoordelijk voor het blootstellen van de servicefactory aan de servicebroker, maar ook voor het beheren van welke clients toegang hebben tot de service en om die clients op de hoogte te stellen wanneer de toegang tot die service wordt gewijzigd.

Samenstelling van een makelaarsdienst

Een brokered service bestaat uit de volgende elementen:

  • Een interface die de functionaliteit van de service declareert en fungeert als een contract tussen de service en de bijbehorende clients.
  • Een implementatie van die interface.
  • Een ServiceMoniker om een naam en een versie toe te wijzen aan de service.
  • Een ServiceRpcDescriptor die het ServiceMoniker combineert met gedrag voor het verwerken van RPC indien nodig.
  • Code voor het aanbieden van de servicefabriek
  • Serviceregistratie

Service-interface

Dit kan een standaard .NET-interface zijn (vaak geschreven in C#). Om te zorgen dat dienstklanten en diensten in verschillende processen kunnen bestaan en via RPC communiceren, moet deze interface zich houden aan de beperkingen zoals specifiek door de ServiceRpcDescriptor die uw dienst gebruikt. Deze beperkingen omvatten doorgaans dat eigenschappen en indexeerfuncties niet zijn toegestaan en de meeste of alle methoden retourneren Task of een ander asynchroon compatibel retourtype.

Gemediëerde dienstbijnamen en beschrijvingen

Voor het activeren van een service moet u weten wat de moniker is. Omdat de moniker is opgenomen in de descriptor van de service, kan een client meestal gewoon omgaan met de ServiceRpcDescriptor. Een descriptor voegt het gedrag toe dat nodig is voor het instellen van een RPC-verbinding tussen de brokered-service en de bijbehorende client of wanneer dit nodig is om RPC-aanroepen naar/van een Streamte serialiseren.

Visual Studio raadt het gebruik van het ServiceJsonRpcDescriptor afgeleide type aan voor brokered services die gebruikmaken van de StreamJsonRpc-bibliotheek wanneer voor de client en service RPC is vereist om te communiceren. StreamJsonRpc past bepaalde beperkingen toe op de serviceinterface, zoals hier beschreven.

Een descriptor moet zelden rechtstreeks worden gebruikt. In plaats daarvan wordt deze doorgaans verkregen uit VisualStudioServices of een bibliotheek die de service aanbiedt en vervolgens wordt gebruikt als argument voor GetProxyAsync.

Zowel de ServiceMoniker als ServiceJsonRpcDescriptor klassen zijn onveranderbaar en dus veilig om te delen als static readonly velden of eigenschappen. Elk ander ServiceRpcDescriptor- afgeleide type moet onveranderbaar zijn.

Een ServiceMoniker is serialiseerbaar. Een ServiceJsonRpcDescriptor is niet serialiseerbaar.

Servicedoelgroep

Elke brokered service wordt geregistreerd met een selectie van vlaggen van ServiceAudience. Met deze vlaggen bepaalt u bij welke clients en verbindingen de bemiddelde dienst beschikbaar wordt gesteld.

Een typische selectie is ServiceAudience.Local, waarmee de service beschikbaar wordt gesteld aan elk lokaal proces binnen een Visual Studio-sessie. Met deze instelling wordt de service altijd lokaal geactiveerd, zelfs als een live gedeelde sessie actief is.

Wanneer de ServiceAudience.LiveShareGuest vlag wordt toegevoegd, krijgt een Live Share-gast die om die brokered-service vraagt een proxy naar die brokered-service via de externe verbinding met de Live Share-host.

Elke combinatie van vlaggen die op ServiceAudience gedefinieerd zijn, is legaal. De LiveShareGuest vlag kan worden ingesteld zonder ook de Local vlag in te stellen, bijvoorbeeld om een brokered service alleen beschikbaar te maken voor Live Share-gasten (van een Live Share-host) en nooit lokaal beschikbaar te zijn (waarbij de client en service zich in hetzelfde proces bevinden).

De RemoteExclusiveClient markeringen en RemoteExclusiveServer vlaggen zijn afgeschaft.

Wanneer een client een brokered service aanvraagt, hoeft deze niet te weten wat de ServiceAudience is voor die service of waar de service wordt geactiveerd. Het kan echter handig zijn voor een service om deze waarde vast te leggen en voor een ontwikkelaar die de service gebruikt om te weten waar een service kan worden geactiveerd, zodat ze kunnen anticiperen op het soort gegevens dat afkomstig kan zijn van die service in verschillende contexten en wanneer een service mogelijk beschikbaar is.

Samenstelling van een bemiddelde cliënt

Wanneer een client een brokered service aanvraagt, wordt null teruggegeven wanneer de service niet beschikbaar is, een ServiceActivationFailedException wordt gegooid als de service niet wordt geactiveerd, of krijgt het een proxy naar de service. Er wordt een proxy gebruikt of de brokered-service wordt geactiveerd in hetzelfde proces als de client of een andere. Deze proxy helpt bij het harmoniseren van gebruikspatronen in de lokale en externe servicecases, zodat de client niet hoeft te weten waar de service zich bevindt.