Udostępnij przez


Podstawowe informacje dotyczące usługi obsługiwanej przez brokera

Usługa obsługiwana przez brokera to usługa uzyskana za pośrednictwem IServiceBrokerelementu i jest uwidaczniona jako interfejs zgodny z RPC, aby umożliwić usłudze i jej klientowi istnienie w odrębnych domenach Aplikacji, procesach, a nawet na maszynach (w przypadku usługi Live Share). Usługa obsługiwana przez brokera może być świadczona z głównego procesu programu Visual Studio lub któregoś z jego procesów pomocniczych i może być wykorzystywana przez dowolny z tych procesów za pośrednictwem rozszerzenia programu Visual Studio.

Więcej usług programu Visual Studio (niewspieranych przez pośrednika) jest dostępnych za pośrednictwem interfejsu, zgodnie z opisem IServiceProvider w temacie Używanie i udostępnianie usług. Takie usługi są zwykle dostępne tylko w głównym procesie programu Visual Studio, ale uwidaczniają większy zestaw funkcji niż usługi obsługiwane przez brokera.

Rozszerzenie programu Visual Studio uruchomione na kliencie Live Share może zapewnić dodatkową funkcjonalność, korzystając z podzbioru tych usług zaoferowanych przez hosta Live Share. Kontrole autoryzacji dotyczą połączeń live share w celu ograniczenia ryzyka złego zachowania gościa usługi Live Share, który narusza bezpieczeństwo hosta live share. Autorzy usług obsługiwanych przez brokerów, którzy zdecydują się uwidocznić swoje usługi za pośrednictwem usługi Live Share, powinni zadbać o zaimplementowanie kontroli autoryzacji zgodnie z opisem w temacie How to provide a brokered service (Jak zapewnić usługę brokera).

Broker usług

Program Visual Studio posiada jeden globalny element IServiceBroker, analogiczny do GlobalProvider, który umożliwia dostęp do innych usług. Można go również pobrać za pośrednictwem MEF.

Mogą istnieć inne, bardziej skoncentrowane na kontekście brokery usług oferowane przez określone funkcje programu Visual Studio, które chcą połączyć globalny broker z własnym, oferującym dodatkowe usługi (lub może wyłączającym niektóre).

Element IServiceBroker to (celowo) czarna skrzynka, która umożliwia klientowi uzyskiwanie usług, które mogą być lokalne, w innym procesie lub na innym komputerze. Brokerzy usług mogą być agregatami jednego lub wielu innych, z zastosowanymi politykami.

Na podstawie kontekstu procesu, w którym jest Visual Studio, ten globalny broker usług jest agregatem zmiennego zestawu innych brokerów usług. Zmiany kontekstu w procesie mogą zmienić zestaw usług obsługiwanych przez brokera, które mogą zostać aktywowane. Na przykład gdy rozwiązanie jest ładowane, usługa powiązana z aktywnym rozwiązaniem może stać się dostępna. Ta sama usługa może być również dostępna w widoku Otwórz folder, choć z inną implementacją zapasową. Zmiana implementacji usługi byłaby niewidoczna dla klienta tej usługi, ponieważ obie implementacje muszą spełnić tę samą umowę, ale klient musi ponownie zapytać o usługę w ramach tej zmiany kontekstu, o której zostanie powiadomiony poprzez AvailabilityChanged, aby uzyskać nową instancję usługi.

Broker usług jest zwykle używany do uzyskania proxy do usługi. Oznacza to, że zamiast bezpośrednio otrzymywać odwołanie do obiektu usługi, klient otrzymuje zastępnik, który przekazuje wszystkie wywołania metod do usługi oraz zwraca wyniki lub wyjątki z powrotem do klienta. Może również przekazywać zdarzenia zgłaszane przez usługę do klienta. W niektórych przypadkach usługa może obsługiwać lub wymagać, aby klient oferował "obiekt docelowy", który umożliwia wywoływanie metod odsyłających odpowiedzi do klienta.

Kontener usługi brokerowanej

Usługi muszą być oferowane do IBrokeredServiceContainer, aby były dostępne w globalnym IServiceBroker. Ten kontener usługi jest odpowiedzialny nie tylko za uwidacznianie fabryki usług brokerowi usług, ale także za kontrolowanie, którzy klienci mają dostęp do usługi i powiadamianie tych klientów o zmianie dostępu do tej usługi.

Kompozycja usługi obsługiwanej przez brokera

Usługa brokerowana składa się z następujących elementów:

  • Interfejs, który deklaruje funkcjonalność usługi i służy jako kontrakt między usługą a jej klientami.
  • Implementacja tego interfejsu.
  • ServiceMoniker do przypisania nazwy i wersji usługi.
  • Element ServiceRpcDescriptor, który łączy ServiceMoniker z zachowaniem umożliwiającym obsługę RPC w razie potrzeby.
  • Kod pozwalający na oferowanie fabryki usług
  • Rejestracja usługi

Interfejs usługi

Może to być standardowy interfejs .NET (często napisany w języku C#). Aby umożliwić klientom i usługom obsługiwanym przez brokera istnienie w różnych procesach i komunikację za pośrednictwem RPC, ten interfejs musi przestrzegać ograniczeń określonych przez ServiceRpcDescriptor, które będą używane przez usługę. Te ograniczenia zazwyczaj obejmują to, że właściwości i indeksatory nie są dozwolone, a większość lub wszystkie metody zwracają Task lub inny typ kompatybilny z async.

Nazwy i opisy usług pośredniczonych

Aktywowanie usługi wymaga znajomości jego nazwy. Ponieważ moniker jest zawarty w deskryptorze usługi, klient może zwykle zajmować się tylko ServiceRpcDescriptor. Deskryptor dodaje niezbędne zachowanie do skonfigurowania połączenia RPC między usługą pośredniczącą a jej klientem lub, w razie potrzeby, do serializacji wywołań RPC do/z Stream.

Program Visual Studio zaleca używanie typu pochodnego ServiceJsonRpcDescriptor dla usług brokerskich, które korzystają z biblioteki StreamJsonRpc, gdy klient i usługa wymagają komunikacji RPC. StreamJsonRpc stosuje pewne ograniczenia dotyczące interfejsu usługi, jak opisane tutaj.

Deskryptor rzadko musi być używany bezpośrednio. Zamiast tego zazwyczaj uzyskuje się ją z VisualStudioServices lub z biblioteki, która oferuje taką usługę, a następnie jest używana jako argument do GetProxyAsync.

Zarówno klasy ServiceMoniker i ServiceJsonRpcDescriptor są niezmienne, a tym samym bezpieczne do udostępniania jako pola lub właściwości static readonly. Każdy inny ServiceRpcDescriptortyp pochodny powinien być niezmienny.

Element A ServiceMoniker jest serializowalny. Nie można zserializować elementu ServiceJsonRpcDescriptor.

Odbiorcy usługi

Każda usługa pośredniczona jest zarejestrowana z zestawem flag z ServiceAudience. Te flagi kontrolują, których klientów i za pośrednictwem jakich połączeń będzie udostępniana usługa brokerska.

Typowy wybór to ServiceAudience.Local, który uwidacznia usługę w dowolnym procesie lokalnym w ramach sesji programu Visual Studio. Dzięki temu ustawieniu usługa jest zawsze aktywowana lokalnie, nawet jeśli sesja live shared jest aktywna.

Po dodaniu flagi, gość Live Share, który żąda usługi obsługiwanej przez brokera, otrzyma serwer proxy do tej usługi za pośrednictwem połączenia zdalnego z hostem Live Share.

Każda kombinacja flag zdefiniowanych na ServiceAudience jest legalna. Flaga LiveShareGuest może być ustawiona bez ustawiania Local flagi, na przykład, aby udostępnić usługę brokerowaną tylko dla gości Live Share (od hosta Live Share) i nigdy nie będzie dostępna lokalnie (gdzie klient i usługa są w tym samym procesie).

Flagi RemoteExclusiveClient i RemoteExclusiveServer są przestarzałe.

Gdy klient żąda usługi obsługiwanej przez brokera, nie musi wiedzieć, do czego ServiceAudience służy dla tej usługi ani gdzie zostanie uruchomiona usługa. Jednakże może być przydatne, jeśli usługa udokumentuje tę wartość, a deweloper korzystający z tej usługi będzie świadomy, gdzie usługa może zostać aktywowana, aby przewidzieć rodzaj danych, które mogą pochodzić z tej usługi w różnych kontekstach oraz kiedy usługa może być dostępna.

Kompozycja klienta obsługiwanego przez brokera

Gdy klient żąda usługi obsługiwanej przez brokera, następuje null powrót, gdy usługa jest niedostępna, ServiceActivationFailedException zgłaszany, jeśli usługa kończy się niepowodzeniem w aktywacji, lub otrzymuje serwer proxy do usługi. Proxy jest używany niezależnie od tego, czy usługę brokera uruchomiono w tym samym procesie co klient, czy w innym. Ten serwer proxy pomaga zharmonizować wzorce użycia w lokalnych i zdalnych przypadkach usług, dzięki czemu klient nie musi wiedzieć, gdzie znajduje się usługa.