次の方法で共有


仲介サービスのトラブルシューティング

適用対象: Visual Studio 2019 以降のバージョン

この記事では、Visual Studio SDK で 仲介サービス を取得しようとしたときに発生する可能性があるいくつかの一般的な問題に関するトラブルシューティングの提案と考えられる解決策について説明します。

ブローカー サービスは、さまざまな方法で失敗する可能性があります。 調査を開始する際に役立つ手法は、Visual Studio アクティビティ ログをチェックすることです。これは、多くの場合、ブローカーサービスで問題が発生したときにエラーや警告をログに記録します。

サービスを要求するときの問題

おそらく、仲介サービスの最も一般的な課題は、 または の呼び出しから得られる結果または例外をIServiceBroker.GetProxyAsyncIServiceBroker.GetPipeAsync理解することです。 仲介 IServiceBroker サービスをアクティブ化する場所と方法に関する懸念を意図的に抽象化します。 しかし、問題が発生した場合は、問題を診断して修正するために、より深くドリルする必要があります。

サービスなし

サービス要求の結果は、次のいずれかの条件が満たされている場合です null

  • 要求されたサービスが登録されていません。 ブローカーサービス作成者は、手動で ProvideBrokeredServiceAttribute 作成された .pkgdef ファイルに登録する必要があります。
  • 要求されたサービスは、このクライアントにサービスを公開しない構成で登録されます。 既定のスコープは です ServiceAudience.Process。つまり、ブローカーサービスは、クライアントと同じプロセスから提供されている場合にのみアクティブ化できます。 クライアントが別のプロセスにあり、ブローカーサービスが使用できるようにするための意図である場合は、サービス登録を変更してその を拡張 ServiceAudienceします。
  • 要求されたサービスが に ServiceAudience.LiveShareGuest登録されている場合、Live Share 接続は存在しますが、ホストはその仲介サービスを提供していません。または ProvideBrokeredServiceAttribute.AllowTransitiveGuestClients 、 プロパティが に true設定されていません。 Live Share 経由で仲介サービスを公開する場合は、「 仲介サービスをセキュリティで保護する方法」を参照してください。
  • 要求されたサービスは登録されていますが、ファクトリを提供できるように初期化するパッケージに関する情報がありません。 属性は ProvideBrokeredServiceAttribute 、属性が適用されたパッケージを示す登録を自動的に生成し、Visual Studio が必要に応じてそのパッケージを読み込むことができます。 属性が間違ったパッケージに適用されている場合、または .pkgdef ファイルが手動で作成されている場合、この情報が見つからないか、不正確である可能性があります。
  • ブローカーサービスのプロファリングを担当する Visual Studio パッケージは、初期化中にスローされるか、それ以外の場合は実際にそのサービス ファクトリの提供に失敗します。 パッケージの読み込みエラーの証拠については、Visual Studio アクティビティ ログ を確認してください。
  • サービス ファクトリ自体は を返します null

サービス要求が例外をスローする

サービス ファクトリが例外を ServiceCompositionException スローすると、サービス要求によって がスローされる場合があります。 これは、結果につながる上記 null のすべての問題は適用されません。 例外の詳細 (内部例外を含む) を確認して、問題が発生した内容を把握し、クライアントまたはサービス ファクトリに必要な修正を行います。

リモート サービスが想定されている間にローカル サービスを取得する

要求は、サービスの登録と Visual Studio の現在の状態に応じて、ローカルまたはリモートで満たされる場合があります。 既定のスコープは です ServiceAudience.Process。つまり、ブローカーサービスは、クライアントと同じプロセスから提供されている場合にのみアクティブ化できます。

仲介サービスを Live Share ホストから接続されたゲストに公開する必要があるが ServiceAudience 、 がローカル スコープに制限されている場合、Live Share ゲストからの要求によって、ホストではなく、その同じマシンからの仲介サービスがアクティブになります。 登録を更新して、Live Share 経由でブローカー サービスを公開するように含 ServiceAudience.LiveShareGuest めます。 も に設定ProvideBrokeredServiceAttribute.AllowTransitiveGuestClientstrueする必要があります。

重要

仲介サービスの登録は、ホストから仲介サービスをアクティブ化する際にゲストをサポートするために、Live Share ゲストとホストの両方に存在する必要があります。

Live Share 経由で仲介サービスを公開する場合は、「 仲介サービスをセキュリティで保護する方法」を参照してください。

サービスを提供するときの問題

ブローカーサービスを提供する方法に関する AsyncPackage ページで説明されているように、仲介されたサービスが MEF 経由でエクスポートされない限り、 ブローカーサービスはクラスから提供する必要があります。

ブローカー サービスを提供しようとすると、次のいずれかの条件が満たされた場合に例外がスローされます。

  • 提供されるサービスのモニカーは、登録されているサービスと完全に一致しません (名前とバージョン)。
  • 同じサービス モニカーに対してファクトリが既に提供されています。

IBrokeredServiceContainer.Proffer 呼び出しの結果は です IDisposable。 この値が破棄された後、ブローカーサービスは新しい要求では使用できなくなります。 ブローカーサービスがオープン ソリューションなどのコンテキストに対して特定のアフィニティを持つ場合は、そのコンテキストがアクティブな場合にのみブローカーサービスを提供することが適切な場合があります。 パッケージが破棄されるときに、この値を保持して破棄する必要はありません。

クライアントとサービスの間の RPC のトレース

クライアントとサービスの間の接続が確立されると、通信のトレースは、特に異なるプロセスにある場合に役立ちます。

既定では、(RPC が適用されるように) プロセスにまたがる仲介サービス間の通信のトレースは、ディレクトリ内にある .svclog ファイルに %TEMP%\VSLogs 記録されます。 これらの xml ファイルは、 サービス トレース ビューアーで最適に表示されます。 このツールでは、多数 の .svclog ファイルを一度に開き、それらを一緒にステッチしてマルチパーティ グラフを作成して、クライアントとサービスの間の RPC をはるかに簡単に理解できます。

ブローカーサービス自体は、これらの .svclog トレース ファイルに追加するために直接トレースすることができ、ブローカーされたサービス動作の診断をさらに支援します。 に保存 %TEMP%\VSLogs されたトレースは、"問題の報告" コマンドが呼び出され、ユーザーがログの共有を選択したときに収集される可能性があります。

独自のメッセージをトレースして、他 の .svclog トレースと簡単に検出して組み合わせることができるようにするには、コード (仲介サービスの有無にかかわらず) 次のような操作を実行できます。

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

myTraceSourceトレースには、トレースを .svclog ファイルに書き込むための適切なリスナーが追加されているため、 を使用できるようになりました。 使用する が既にある場合は TraceSource 、 メソッドに RegisterLogSourceAsync 渡し、リスナーが既存 TraceSourceの に追加されるため、結果を破棄します。

リモート クライアントにサービスを提供するブローカー サービスからトレースする場合、サービス トレース ビューアーを使用して全体的なビューを表示するために、svclog をクライアントの svclog と一緒にステッチできるようにする、コードが実行される にアクティビティが自動的に割り当てられますExecutionContext

関連情報