検査ミドルウェアを使用してボットをデバッグする

適用対象: SDK v4

この記事では、検査ミドルウェアを使用してボットをデバッグする方法について説明します。 この機能を使用すると、Bot Framework Emulatorはボットとの間のトラフィックをデバッグし、ボットの現在の状態を確認できます。 トレース メッセージを使用してEmulatorにデータを送信し、会話の任意のターンでボットの状態を検査できます。

Bot Framework v4 Create a bot を使用してローカルに構築された EchoBot を使用して 、ボット のメッセージ状態をデバッグおよび検査する方法を示します。 また、IDE を使用してボットをデバッグしたり、Bot Framework Emulator を使用してデバッグしたりすることもできますが、状態をデバッグするには、検査ミドルウェアをボットに追加する必要があります。 検査ボットのサンプルは、 C#JavaScriptJavaPython で使用できます。

前提条件

  • Bot Framework Emulator をダウンロードしてインストールする
  • ボットのミドルウェアの知識
  • ボットの管理状態の知識
  • ngrok をダウンロードしてインストールする (追加のチャネルを使用するために、Azure に構成されているボットをデバッグする場合)

Emulatorを最新バージョンに更新する

ボット検査ミドルウェアを使用してボットをデバッグする前に、Emulatorをバージョン 4.5 以降に更新します。 最新バージョンで更新プログラムを確認してください。

Emulatorのバージョンを確認するには、メニューの [ヘルプ] を選択し、[バージョン情報] を選択します。 現在のバージョンのEmulatorが表示されます。

current version

ボットのコードを更新する

検査状態を設定し、Startup.cs ファイル内のアダプターに検査ミドルウェアを追加します。 検査状態は、依存関係の挿入によって提供されます。 以下のコード更新プログラムを参照するか、GitHubの検査ミドルウェア のサンプルを参照してください。

Startup.cs

// The Inspection Middleware needs some scratch state to keep track of the (logical) listening connections.
services.AddSingleton<InspectionState>();

// Create the Bot Adapter with error handling enabled.
services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithInspection>();

AdapterWithInspection.cs

public class AdapterWithInspection : CloudAdapter
{
    public AdapterWithInspection(BotFrameworkAuthentication auth, IConfiguration configuration, InspectionState inspectionState, UserState userState, ConversationState conversationState, ILogger<IBotFrameworkHttpAdapter> logger)
        : base(auth, logger)
    {
        // Inspection needs credentials because it will be sending the Activities and User and Conversation State to the emulator
        var credentials = new MicrosoftAppCredentials(configuration["MicrosoftAppId"], configuration["MicrosoftAppPassword"]);

        Use(new InspectionMiddleware(inspectionState, userState, conversationState, credentials));

        OnTurnError = async (turnContext, exception) =>
        {
            // Log any leaked exception from the application.
            logger.LogError(exception, $"[OnTurnError] unhandled error : {exception.Message}");

            // Send a message to the user
            await turnContext.SendActivityAsync("The bot encountered an error or bug.");
            await turnContext.SendActivityAsync("To continue to run this bot, please fix the bot source code.");

            // Send a trace activity, which will be displayed in the Bot Framework Emulator
            await turnContext.TraceActivityAsync("OnTurnError Trace", exception.Message, "https://www.botframework.com/schemas/error", "TurnError");
        };
    }
}

EchoBot.cs ファイル内のボット クラスを更新します。

EchoBot.cs

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var conversationStateProp = _conversationState.CreateProperty<CustomState>("customState");
    var convProp = await conversationStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    var userStateProp = _userState.CreateProperty<CustomState>("customState");
    var userProp = await userStateProp.GetAsync(turnContext, () => new CustomState { Value = 0 }, cancellationToken);

    await turnContext.SendActivityAsync(MessageFactory.Text($"Echo: {turnContext.Activity.Text} conversation state: {convProp.Value} user state: {userProp.Value}"), cancellationToken);

    convProp.Value++;
    userProp.Value++;
}

ボットをローカルでテストする

コードを更新した後、ボットをローカルで実行し、2 つのエミュレーター (1 つはメッセージの送受信、もう 1 つはデバッグ モードでメッセージの状態を検査する) を使用してデバッグ機能をテストできます。 ボットをローカルでテストするには、次の手順を実行します。

  1. ターミナルでボットのディレクトリに移動し、次のコマンドを実行してボットをローカルで実行します。

    dotnet run
    
  2. Emulatorを開きます。 [ ボットを開く] を選択します。 ボットの URL とhttp://localhost:3978/api/messagesMicrosoftAppId と MicrosoftAppPassword の値を入力します。 JavaScript ボットの場合、これらの値はボットの .env ファイルにあります。 C# ボットの場合、これらの値は appsettings.json ファイルにあります。 Java ボットの場合は、 application.properties ファイルでこれらの値を見つけることができます。 [接続] を選択します。

  3. 次に、別のEmulator ウィンドウを開きます。 この 2 番目のEmulator ウィンドウはデバッガーとして機能します。 前の手順で説明した指示に従います。 [デバッグ モードで開く] をオンにし、[Connect] を選択します。

  4. この時点で、デバッグ Emulatorに一意の識別子 (/INSPECT attach <identifier>) を持つコマンドが表示されます。 デバッグ エミュレーターから識別子と共にコマンド全体をコピーし、最初のエミュレーターのチャット ボックスに貼り付けます。

    注意

    ボットのコードに検査ミドルウェアを追加すると、デバッグ モードでEmulatorが起動されるたびに一意の識別子が生成されます。

  5. これで、最初のEmulatorのチャット ボックスにメッセージを送信し、デバッグ Emulatorのメッセージを調べることができます。 メッセージの状態を検査するには、デバッグ Emulatorで [Bot State] を選択し、適切な JSON ウィンドウでを展開します。 デバッグ Emulatorにボットの状態が表示されます。

    bot state

Azure に構成されたボットの状態を検査する

Azure で構成され、チャネル (Teams など) に接続されているボットの状態を調べるには、ngrok をインストールして実行する必要があります。

ngrok を実行する

この時点で、Emulatorを最新バージョンに更新し、ボットのコードに検査ミドルウェアを追加しました。 次の手順では、ngrok を実行し、ローカル ボットを構成します。 ngrok を実行する前に、ボットをローカルで実行する必要があります。

ボットをローカルで実行するには、次の操作を行います。

  1. ターミナルでボットのフォルダーに移動し、最新のビルドを使用するようにnpm登録を設定します

  2. ボットをローカルで実行します。 ボットが次のような 3978ポート番号を公開していることがわかります。

  3. 別のコマンド プロンプトを開き、ボットのプロジェクト フォルダーに移動します。 次のコマンドを実行します。

    ngrok http 3978
    
  4. これで、ローカルに実行されているボットに ngrok が接続されました。 セキュリティで保護された (HTTPS) パブリック IP アドレスをコピーします。

    ngrok success

ボット リソースを更新する

ローカル ボットが ngrok に接続されたので、ngrok URL を使用するように Azure でボット リソースを構成できます。

  1. Azure のボット リソースに移動します。 左側のメニューの [設定] で [構成] を選択します。

    1. メッセージング エンドポイントを、コピーした ngrok IP アドレスに設定します。 必要な場合、IP アドレスの後に /api/messages を追加します。 たとえば、「 https://e58549b6.ngrok.io/api/messages 」のように入力します。

    2. [ ストリーミング エンドポイントの有効化] を選択します

      Set endpoint

    3. [適用] を選択して変更を保存します。

      ヒント

      [適用] が有効になっていない場合は、[ストリーミング エンドポイントの有効化] をオフにして [適用] を選択し、[ストリーミング エンドポイントを有効にする] をオンにし、[適用] をもう一度選択します。 [Enable Streaming Endpoint]\(ストリーミング エンドポイントを有効にする\) がオンになっており、エンドポイントの構成が保存されていることを確認する必要があります。

  2. ボットのリソース グループに移動します。

    1. [ デプロイ] を選択し、以前に正常にデプロイされたボット リソースを選択します。 左側のメニューから [テンプレート ] を選択して、ボットに関連付けられている Web アプリの MicrosoftAppIdMicrosoftAppPassword を取得します。

      Get inputs

    2. ボットの構成ファイル (c# の場合は appsettings.json 、JavaScript の場合 は .env ) を MicrosoftAppIdMicrosoftAppPassword で更新します。

  3. Emulatorを開始し、[ボットを開く] を選択し、ボットの URL を入力http://localhost:3978/api/messagesします。 Microsoft アプリ IDMicrosoft App パスワードには、ボットの構成ファイルに追加したのと同じ MicrosoftAppIdMicrosoftAppPassword を入力します。 次に、 [接続](Connect) を選択します。

  4. これで、実行中のボットが Azure のボット リソースに接続されました。 Web チャットで Azure でボットをテストするには、ボット リソースに移動し、Web チャットでテストを選択し、ボットにメッセージを送信します。

デバッグ モードを有効にする

  1. Emulatorで[デバッグ]、[デバッグの開始] の順に選択します。

  2. ボット URL の ngrok IP アドレス (/api/messages の追加を忘れないでください) を入力します (例: https://e58549b6.ngrok.io/api/messages)。

    1. Microsoft アプリ ID の場合は、ボットのアプリ ID を入力します。
    2. Microsoft App パスワードの場合は、ボットのアプリ シークレットを入力します。
    3. また、 [Open in debug mode]\(デバッグ モードで開く\) がオンになっていることも確認します。
    4. [接続] を選択します。
  3. デバッグ モードを有効にすると、Emulatorによって UUID が生成されます。 UUID は、Emulatorでデバッグ モードを開始するたびに生成される一意の ID です。

  4. UUID をコピーして、チャネルのチャット ボックスWeb チャットチャット ボックスのテストに貼り付けます。 チャット ボックスに "セッションにアタッチされ、すべてのトラフィックが検査のためにレプリケートされています" というメッセージが表示されます。

構成済みチャネルのチャット ボックスでメッセージを送信することにより、ボットのデバッグを開始できます。 ローカル Emulatorは、デバッグのすべての詳細を含むメッセージを自動的に更新します。 ボットのメッセージの状態を調べるには、[ ボットの状態 ] を選択し、適切な JSON ウィンドウで を展開します。

debug-inspection-middleware

その他のリソース