Delen via


Problemen met brokered services oplossen

Van toepassing op: Visual Studio 2019 en latere versies

In dit artikel worden suggesties voor probleemoplossing en mogelijke oplossingen geïntroduceerd voor verschillende veelvoorkomende problemen die kunnen optreden wanneer u probeert een brokered service te verkrijgen in de Visual Studio SDK.

Brokered services kunnen op verschillende manieren mislukken. Een handige techniek om met uw onderzoek te beginnen, is om het Activiteitenlogboek van Visual Studio te controleren, waarbij vaak fouten of waarschuwingen worden vastgelegd wanneer er problemen zijn met brokered services.

Problemen bij het aanvragen van een service

Misschien is de meest voorkomende uitdaging met brokered services het resultaat of de uitzondering die ze krijgen van een aanroep naar IServiceBroker.GetProxyAsync of IServiceBroker.GetPipeAsync. Een IServiceBroker bewust abstractie maakt zich zorgen over waar en hoe een brokered service kan worden geactiveerd. Maar wanneer er iets misgaat, moet u dieper inzoomen om het probleem vast te stellen en te corrigeren.

Geen service

Het resultaat van een serviceaanvraag kan zijn null wanneer aan een van de volgende voorwaarden wordt voldaan:

  • De aangevraagde service is niet geregistreerd. De auteur van de brokered-service moet deze registreren bij ProvideBrokeredServiceAttribute of een hand-authored .pkgdef-bestand .
  • De aangevraagde service wordt geregistreerd bij de configuratie die de service niet beschikbaar maakt voor deze client. Het standaardbereik is ServiceAudience.Process, wat betekent dat de brokered service alleen kan worden geactiveerd wanneer deze wordt geactiveerd vanuit hetzelfde proces als de client. Als de client zich in een ander proces bevindt en de bedoeling is dat de brokered-service beschikbaar is, wijzigt u de serviceregistratie om het ServiceAudienceuit te breiden.
  • De aangevraagde service is geregistreerd bij ServiceAudience.LiveShareGuest, er bestaat een Live Share-verbinding, maar de host biedt niet aan dat brokered service of de ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients eigenschap niet is ingesteld op true. Als u een brokered service beschikbaar wilt maken via Live Share, raadpleegt u Hoe u een brokered service beveiligt.
  • De aangevraagde service is geregistreerd, maar er ontbreekt informatie over welk pakket moet worden geïnitialiseerd, zodat de factory kan worden geprofferd. Het ProvideBrokeredServiceAttribute kenmerk genereert automatisch registratie waarmee het pakket wordt aangegeven waarop het kenmerk is toegepast, zodat Visual Studio dat pakket indien nodig kan laden. Als het kenmerk wordt toegepast op het verkeerde pakket of het PKGDEF-bestand met de hand is geschreven, ontbreekt deze informatie of is deze informatie onjuist.
  • Het Visual Studio-pakket dat verantwoordelijk is voor het profferen van de brokered-service, wordt gegenereerd tijdens de initialisatie of kan die servicefactory niet daadwerkelijk activeren. Controleer het Activiteitenlogboek van Visual Studio op bewijs van een pakketbelastingsfout.
  • De servicefactory zelf retourneert null.

De serviceaanvraag genereert een uitzondering

Een serviceaanvraag kan een ServiceCompositionException uitzondering genereren wanneer de servicefactory een uitzondering genereert. Dit betekent dat alle hierboven genoemde problemen ertoe leiden dat een null resultaat niet van toepassing is. Bekijk de details van de uitzondering (inclusief interne uitzonderingen) om te begrijpen wat er mis is gegaan en breng eventuele benodigde correcties aan de client of de servicefactory aan.

U krijgt een lokale service terwijl een externe service werd verwacht

Een aanvraag kan lokaal of extern worden uitgevoerd, afhankelijk van de serviceregistratie en de huidige status van Visual Studio. Het standaardbereik is ServiceAudience.Process, wat betekent dat de brokered service alleen kan worden geactiveerd wanneer deze wordt geactiveerd vanuit hetzelfde proces als de client.

Wanneer een brokered service beschikbaar moet worden gemaakt van een Live Share-host voor een verbonden gast, maar de ServiceAudience service beperkt is tot lokale bereiken, activeert een aanvraag van een Live Share-gast de brokered-service van diezelfde computer in plaats van de host. Werk registratie bij om uw brokered services beschikbaar te ServiceAudience.LiveShareGuest maken via Live Share. Mogelijk moet u dit ook instellen ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients true .

Belangrijk

Registratie voor de brokered-service moet bestaan op zowel de Live Share-gast als de host om de gast te ondersteunen bij het activeren van de brokered-service van de host.

Als u een brokered service beschikbaar wilt maken via Live Share, raadpleegt u Hoe u een brokered service beveiligt.

Problemen bij het profferen van een service

Een brokered service moet worden geproffered vanuit een AsyncPackage klasse, tenzij de brokered service wordt geëxporteerd via MEF, zoals wordt beschreven in How to provide a brokered service.

Een poging om een brokered service te profferen genereert een uitzondering als aan een van deze voorwaarden is voldaan:

  • De moniker voor de service die wordt geproffered, komt niet exact overeen met een service die is geregistreerd (naam en versie).
  • Er is al een fabriek gebruikt voor dezelfde service-moniker.

Het resultaat van een aanroep is IBrokeredServiceContainer.Proffer een IDisposable. Een brokered service is niet meer beschikbaar voor nieuwe aanvragen nadat deze waarde is verwijderd. Wanneer uw brokered service specifieke affiniteit heeft met bepaalde contexten, zoals een open oplossing, is het mogelijk geschikt om de brokered service alleen uit te geven wanneer die context actief is. Het is niet nodig om deze waarde te behouden en te verwijderen wanneer uw pakket wordt verwijderd.

RPC traceren tussen client en service

Zodra een verbinding tussen client en service tot stand is gebracht, kan het traceren van de communicatie nuttig zijn, met name wanneer ze zich in verschillende processen bevinden.

Standaard worden traceringen van communicatie tussen brokered services die processen omvatten (zodat RPC van toepassing is) vastgelegd in .svclog-bestanden in de %TEMP%\VSLogs map. Deze XML-bestanden worden het beste weergegeven met de Service Trace Viewer. Dit hulpprogramma kan veel .svclog-bestanden tegelijk openen en ze samenvoegen om een graaf met meerdere partijen te vormen om inzicht te krijgen in de RPC tussen client en service veel eenvoudiger.

Een brokered service zelf kan rechtstreeks traceren om toe te voegen aan deze .svclog traceringsbestanden, verdere hulp bij diagnostische gegevens van brokered servicegedrag. Traceringen die zijn opgeslagen, %TEMP%\VSLogs kunnen worden verzameld wanneer de opdracht Een probleem melden wordt aangeroepen en de gebruiker ervoor kiest om logboeken te delen.

Als u uw eigen berichten wilt traceren, zodat ze eenvoudig kunnen worden gedetecteerd en gecombineerd met andere .svclog-traceringen , kan uw code (of een brokered service al dan niet) zoiets kan doen:

// Define your log's ID, a namespace-like fully qualified name.
// In general it is expected that you follow you team's assembly namespace.
// Also an optional parameter, the ServiceMoniker for your service
var myLogId = new LogId("Microsoft.SomeTeam.MyLogName", serviceId: null);

var requestedLevel = new LoggingLevelSettings(SourceLevels.Warning | SourceLevels.ActivityTracing);
var myLogOptions = new LoggerOptions(requestedLevel, PrivacyFlags.MayContainPrivateInformation);

TraceSource myTraceSource;
using (TraceConfiguration traceConfig = await TraceConfiguration.CreateTraceConfigurationInstanceAsync(serviceBroker, ownsServiceBroker: false, cancellationToken))
{
    myTraceSource = await traceConfig.RegisterLogSourceAsync(myLogId, myLogOptions, traceSource: null, cancellationToken);
}

De myTraceSource kan nu worden gebruikt voor tracering, omdat de juiste listeners zijn toegevoegd om uw traceringen naar een .svclog-bestand te schrijven. Als u al een TraceSource gebruiker hebt die u wilt gebruiken, geeft u deze door aan de RegisterLogSourceAsync methode en negeert u het resultaat omdat de listeners worden toegevoegd aan uw bestaande TraceSource.

Bij het traceren van een brokered-service die een externe client bedient, wordt automatisch een activiteit toegewezen aan de ExecutionContext activiteit waarin uw code wordt uitgevoerd, zodat het svclog samen met het clientsvclog kan worden genaaid om een holistische weergave te zien met behulp van de Service Trace Viewer.

Verwijzingen