Freigeben über


Problembehandlung bei brokerierten Diensten

Gilt für: Visual Studio 2019 und höhere Versionen

In diesem Artikel werden Vorschläge zur Problembehandlung und mögliche Lösungen für mehrere häufige Probleme vorgestellt, die auftreten können, wenn Sie versuchen, einen brokerierten Dienst im Visual Studio SDK zu erhalten.

Brokered Services können auf verschiedene Arten fehlschlagen. Eine nützliche Technik zum Starten Ihrer Untersuchung besteht darin, das Visual Studio-Aktivitätsprotokoll zu überprüfen, das häufig Fehler oder Warnungen protokolliert, wenn Dinge mit brokerierten Diensten verwölgt werden.

Probleme beim Anfordern eines Diensts

Vielleicht die häufigste Herausforderung bei vermittelten Diensten besteht darin, das Ergebnis oder die Ausnahme zu verstehen, das sie von einem Anruf an IServiceBroker.GetProxyAsync oder IServiceBroker.GetPipeAsync. Ein IServiceBroker absichtliches Abstrahieren von Bedenken darüber, wo und wie ein vermittelter Dienst aktiviert werden kann. Aber wenn die Dinge schief gehen, ist es notwendig, tiefer zu drillen, um das Problem zu diagnostizieren und zu beheben.

Kein Dienst

Das Ergebnis einer Serviceanfrage kann sein null , wenn eine der folgenden Bedingungen zutrifft:

  • Der angeforderte Dienst ist nicht registriert. Der brokerierte Dienstautor sollte ihn bei ProvideBrokeredServiceAttribute oder mit einer handverfassten PKGDEF-Datei registrieren.
  • Der angeforderte Dienst wird mit der Konfiguration registriert, die den Dienst nicht für diesen Client verfügbar macht. Der Standardbereich lautet ServiceAudience.Process, was bedeutet, dass der brokerierte Dienst nur aktiviert werden kann, wenn er vom gleichen Prozess wie der Client stammt. Wenn sich der Client in einem anderen Prozess befindet und der Zweck darin besteht, dass der brokerierte Dienst verfügbar ist, ändern Sie die Dienstregistrierung, um seine ServiceAudienceErweiterung zu erweitern.
  • Der angeforderte Dienst ist bei ServiceAudience.LiveShareGuestregistriert , eine Live-Freigabeverbindung ist vorhanden, aber der Host bietet diesen brokerierten Dienst nicht an, oder die ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients Eigenschaft ist nicht auf festgelegt true. Wenn Sie einen brokerierten Dienst über Live Share verfügbar machen, lesen Sie bitte, wie Sie einen brokerierten Dienst sichern.
  • Der angeforderte Dienst ist registriert, enthält jedoch Informationen dazu, welches Paket initialisiert werden soll, damit die Factory bereitgestellt werden kann. Das ProvideBrokeredServiceAttribute Attribut generiert automatisch eine Registrierung, die angibt, dass das Paket, auf das das Attribut angewendet wurde, angewendet wurde, damit Visual Studio dieses Paket nach Bedarf laden kann. Wenn das Attribut auf das falsche Paket angewendet wird oder die .pkgdef-Datei handautoriert ist, fehlen diese Informationen möglicherweise oder ungenau.
  • Das Visual Studio-Paket, das für die Bereitstellung des brokerierten Diensts verantwortlich ist, löst während der Initialisierung aus oder schlägt andernfalls die Dienstfactory tatsächlich fehl. Überprüfen Sie das Visual Studio-Aktivitätsprotokoll auf Nachweise eines Paketladefehlers.
  • Die Dienstfactory selbst gibt zurück null.

Die Dienstanforderung löst eine Ausnahme aus.

Eine Dienstanforderung kann ausgelöst ServiceCompositionException werden, wenn die Dienstfactory eine Ausnahme auslöst. Dies bedeutet, dass alle oben aufgeführten Probleme, die zu einem null Ergebnis führen würden, nicht angewendet werden. Sehen Sie sich die Ausnahmedetails (einschließlich innerer Ausnahmen) an, um zu verstehen, was schief gelaufen ist, und nehmen Sie alle erforderlichen Korrekturen an den Client oder die Dienstfactory vor.

Sie erhalten einen lokalen Dienst, während ein Remotedienst erwartet wurde

Je nach Dienstregistrierung und dem aktuellen Zustand von Visual Studio kann eine Anforderung lokal oder remote erfüllt werden. Der Standardbereich lautet ServiceAudience.Process, was bedeutet, dass der brokerierte Dienst nur aktiviert werden kann, wenn er vom gleichen Prozess wie der Client stammt.

Wenn ein Brokerdienst von einem Livefreigabehost für einen verbundenen Gast verfügbar gemacht werden soll, dies ServiceAudience jedoch auf lokale Bereiche beschränkt ist, aktiviert eine Anforderung eines Livefreigabe-Gasts den brokerierten Dienst von diesem Computer anstelle des Hosts. Aktualisieren Sie die Registrierung, ServiceAudience.LiveShareGuest um Ihre brokerierten Dienste über Live Share verfügbar zu machen. Möglicherweise müssen Sie auch auf diese Einstellung festlegen ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients true .

Wichtig

Die Registrierung für den brokerierten Dienst muss sowohl auf dem Livefreigabe-Gast als auch auf dem Host vorhanden sein, um den Gast bei der Aktivierung des brokerierten Diensts vom Host zu unterstützen.

Wenn Sie einen brokerierten Dienst über Live Share verfügbar machen, lesen Sie bitte, wie Sie einen brokerierten Dienst sichern.

Probleme beim Bereitstellen eines Diensts

Ein vermittelter Dienst muss von einer AsyncPackage Klasse stammen, es sei denn, der brokerierte Dienst wird über MEF exportiert, wie in how to provide a brokered service beschrieben.

Ein Versuch, einen brokerierten Dienst zu vermitteln, löst eine Ausnahme aus, wenn eine dieser Bedingungen zutrifft:

  • Der Moniker für den Dienst, der proffered wird, stimmt nicht genau mit einem Dienst überein (Name und Version), der registriert wurde.
  • Eine Fabrik wurde bereits für den gleichen Service moniker geffert.

Das Ergebnis eines Anrufs IBrokeredServiceContainer.Proffer ist ein IDisposable. Ein brokerierter Dienst ist nach dem Löschen dieses Werts für neue Anforderungen nicht verfügbar. Wenn Ihr brokered-Dienst bestimmte Affinität zu einem bestimmten Kontext wie einer offenen Lösung hat, kann es sinnvoll sein, nur den brokerierten Dienst zu überweisen, wenn dieser Kontext aktiv ist. Es ist nicht erforderlich, diesen Wert beizubehalten und zu verwerfen, wenn Ihr Paket verworfen wird.

Ablaufverfolgung von RPC zwischen Client und Dienst

Sobald eine Verbindung zwischen Client und Dienst hergestellt wurde, kann die Ablaufverfolgung ihrer Kommunikation nützlich sein, insbesondere, wenn sie sich in verschiedenen Prozessen befinden.

Standardmäßig werden Ablaufverfolgungen der Kommunikation zwischen brokerierten Diensten, die Prozesse umfassen (sodass RPC gilt) in Svclog-Dateien im %TEMP%\VSLogs Verzeichnis aufgezeichnet. Diese XML-Dateien werden am besten mit dem Service Trace Viewer angezeigt. Dieses Tool kann viele Svclog-Dateien gleichzeitig öffnen und zusammenheften, um ein Multi-Party-Diagramm zu bilden, um das Verständnis des RPC zwischen Client und Dienst viel einfacher zu machen.

Ein brokered Service selbst kann direkt ablaufen, um diese Svclog-Ablaufverfolgungsdateien hinzuzufügen, um die Diagnose des brokerierten Dienstverhaltens weiter zu unterstützen. Alle gespeicherten %TEMP%\VSLogs Ablaufverfolgungen können gesammelt werden, wenn der Befehl "Problem melden" aufgerufen wird, und der Benutzer wählt die Freigabe von Protokollen.

Um Ihre eigenen Nachrichten so zu verfolgen, dass sie leicht erkannt und mit anderen Svclog-Ablaufverfolgungen kombiniert werden können, kann Ihr Code (unabhängig davon, ob ein brokerter Dienst oder nicht) eine ähnliche Aktion ausführen:

// 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);
}

Die myTraceSource Kann jetzt für die Ablaufverfolgung verwendet werden, da sie die entsprechenden Listener hinzugefügt hat, um Ihre Ablaufverfolgungen in eine SVCLOG-Datei zu schreiben. Wenn Sie bereits ein TraceSource Objekt verwenden möchten, übergeben Sie es an die RegisterLogSourceAsync Methode, und verwerfen Sie das Ergebnis, da die Listener zu Ihren vorhandenen TraceSourcehinzugefügt werden.

Wenn die Ablaufverfolgung von einem brokerierten Dienst, der einem Remoteclient dient, wird automatisch eine Aktivität zugewiesen, in der ExecutionContext Ihr Code ausgeführt wird, in dem der Svclog zusammen mit dem Svclog des Clients zusammengefügt werden kann, um eine ganzheitliche Ansicht mithilfe des Service Trace Viewers anzuzeigen.

References