Direktes Schreiben in den Speicher

GILT FÜR: SDK v4

Sie können ohne Verwendung eines Middleware- oder Kontextobjekts direkt aus Ihrem Speicherobjekt lesen und in das Speicherobjekt schreiben. Dies eignet sich möglicherweise für Daten, die Ihr Bot zum Aufrechterhalten einer Konversation verwendet, oder für Daten, die aus einer Quelle außerhalb des Konversationsflusses Ihres Bots stammen. Bei diesem Datenspeichermodell werden Daten direkt aus dem Speicher gelesen, anstatt einen Zustands-Manager zu verwenden. Die Codebeispiele in diesem Artikel zeigen, wie Sie mithilfe von Speicher, Cosmos DB, Azure Blob und Azure-Blob-Transkripts-Speicher Daten aus dem Speicher lesen und in den Speicher schreiben.

Hinweis

Die Bot Framework-JavaScript-, C#- und Python-SDKs werden weiterhin unterstützt, das Java SDK wird jedoch eingestellt und der langfristige Support endet im November 2023. Es werden nur kritische Sicherheits- und Programmfehlerbehebungen innerhalb dieses Repositorys durchgeführt.

Bestehende Bots, die mit dem Java SDK erstellt wurden, werden weiterhin funktionieren.

Wenn Sie einen neuen Bot erstellen möchten, sollten Sie den Einsatz von Power Virtual Agents in Betracht ziehen und sich über die Auswahl der richtigen Chatbot-Lösung informieren.

Weitere Informationen finden Sie unter Die Zukunft des Bot-Buildings.

Voraussetzungen

Hinweis

Sie können die Vorlagen aus Visual Studio installieren.

  1. Wählen Sie im Menü Erweiterungen dann die Option Erweiterungen verwalten aus.
  2. Suchen Sie im Dialogfeld Erweiterungen verwalten nach Bot Framework v4 SDK-Vorlagen für Visual Studio und installieren Sie sie.

Informationen zum Bereitstellen von .NET-Bots in Azure finden Sie unter Bereitstellen und Veröffentlichen eines Bots.

Informationen zu diesem Beispiel

Der Beispielcode in diesem Artikel beginnt mit der Struktur eines einfachen Echobots und erweitert die Funktionalität des Bots anschließend durch Hinzufügen von zusätzlichem Code (siehe unten). Dieser erweiterte Code erstellt eine Liste, um empfangene Benutzereingaben beizubehalten. Bei jedem Zug wird die vollständige Liste der Benutzereingaben, die im Speicher abgelegt ist, an den Benutzer zurückgesendet. Die Datenstruktur, die diese Liste von Eingaben enthält, wird dann geändert, um sie im Speicher abzulegen. Beim Hinzufügen zusätzlicher Funktionen zum Beispielcode werden verschiedene Speichertypen vorgestellt.

Arbeitsspeicher

Mit dem Bot Framework SDK können Sie Benutzereingaben in In-Memory-Speicher speichern. Da der Speicher im Arbeitsspeicher jedes Mal gelöscht wird, wenn der Bot neu gestartet wird, eignet er sich am besten für Testzwecke und ist nicht für die Produktionsverwendung vorgesehen. Für Bots in Produktionsumgebungen sollten permanente Speichertypen wie etwa Datenbankspeicher verwendet werden.

Erstellen eines einfachen Bots

Die restlichen Abschnitte dieses Themas basieren auf einem Echobot. Der Echo-Bot-Beispielcode kann lokal erstellt werden, indem sie die Schnellstartanweisungen zum Erstellen eines Bots befolgen.

Ersetzen Sie den Code in EchoBot.cs durch den folgenden Code:

using System;
using System.Threading.Tasks;
using Microsoft.Bot.Builder;
using Microsoft.Bot.Schema;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

// Represents a bot saves and echoes back user input.
public class EchoBot : ActivityHandler
{
   // Create local Memory Storage.
   private static readonly MemoryStorage _myStorage = new MemoryStorage();

   // Create cancellation token (used by Async Write operation).
   public CancellationToken cancellationToken { get; private set; }

   // Class for storing a log of utterances (text of messages) as a list.
   public class UtteranceLog : IStoreItem
   {
      // A list of things that users have said to the bot
      public List<string> UtteranceList { get; } = new List<string>();

      // The number of conversational turns that have occurred
      public int TurnNumber { get; set; } = 0;

      // Create concurrency control where this is used.
      public string ETag { get; set; } = "*";
   }

   // Echo back user input.
   protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
   {
      // preserve user input.
      var utterance = turnContext.Activity.Text;

      // Make empty local log-items list.
      UtteranceLog logItems = null;

      // See if there are previous messages saved in storage.
      try
      {
         string[] utteranceList = { "UtteranceLog" };
         logItems = _myStorage.ReadAsync<UtteranceLog>(utteranceList).Result?.FirstOrDefault().Value;
      }
      catch
      {
         // Inform the user an error occurred.
         await turnContext.SendActivityAsync("Sorry, something went wrong reading your stored messages!");
      }

      // If no stored messages were found, create and store a new entry.
      if (logItems is null)
      {
         // Add the current utterance to a new object.
         logItems = new UtteranceLog();
         logItems.UtteranceList.Add(utterance);

         // Set initial turn counter to 1.
         logItems.TurnNumber++;

         // Show user new user message.
         await turnContext.SendActivityAsync($"{logItems.TurnNumber}: The list is now: {string.Join(", ", logItems.UtteranceList)}");

         // Create dictionary object to hold received user messages.
         var changes = new Dictionary<string, object>();
         {
            changes.Add("UtteranceLog", logItems);
         }
         try
         {
            // Save the user message to your Storage.
            await _myStorage.WriteAsync(changes, cancellationToken);
         }
         catch
         {
            // Inform the user an error occurred.
            await turnContext.SendActivityAsync("Sorry, something went wrong storing your message!");
         }
      }
      // Else, our storage already contained saved user messages, add new one to the list.
      else
      {
         // add new message to list of messages to display.
         logItems.UtteranceList.Add(utterance);
         // increment turn counter.
         logItems.TurnNumber++;

         // show user new list of saved messages.
         await turnContext.SendActivityAsync($"{logItems.TurnNumber}: The list is now: {string.Join(", ", logItems.UtteranceList)}");

         // Create Dictionary object to hold new list of messages.
         var changes = new Dictionary<string, object>();
         {
            changes.Add("UtteranceLog", logItems);
         };

         try
         {
            // Save new list to your Storage.
            await _myStorage.WriteAsync(changes,cancellationToken);
         }
         catch
         {
            // Inform the user an error occurred.
            await turnContext.SendActivityAsync("Sorry, something went wrong storing your message!");
         }
      }
   }
}

Starten Ihres Bots

Führen Sie Ihren Bot lokal aus.

Starten des Emulators und Herstellen einer Verbindung mit Ihrem Bot

Installieren Sie Bot Framework Emulator. Starten Sie dann den Emulator und stellen Sie dann im Emulator eine Verbindung mit Ihrem Bot her:

  1. Wählen Sie den Link Neue Bot-Konfiguration erstellen auf der Registerkarte Emulator Willkommen.
  2. Füllen Sie die Felder zur Verbindung mit Ihrem Bot mit den Daten aus, die beim Starten des Bots auf der Webseite angezeigt wurden.

Interagieren mit Ihrem Bot

Senden Sie eine Nachricht an den Bot. Der Bot listet die empfangenen Nachrichten auf.

A conversation with the bot that shows the bot keeping a list of messages from the user.

Im weiteren Verlauf dieses Artikels wird gezeigt, wie man im beständigen Speicher statt im internen Speicher des Bots speichert.

Verwenden von Cosmos DB

Wichtig

Die Klasse Cosmos DB-Speicher wurde als veraltet gekennzeichnet. Bei Containern, die ursprünglich mit CosmosDbStorage erstellt wurden, war kein Partitionsschlüssel festgelegt und sie erhielten den Standardpartitionsschlüssel _/partitionKey.

Mit Cosmos DB-Speicher erstellte Container können mit partitioniertem Cosmos DB-Speicher verwendet werden. Weitere Informationen finden Sie unter Partitionierung in Azure Cosmos DB.

Beachten Sie außerdem, dass der partitionierte Cosmos-DB-Speicher im Gegensatz zum älteren Cosmos-DB-Speicher nicht automatisch eine Datenbank in Ihrem Cosmos-DB-Konto erstellt. Sie müssen eine neue Datenbank manuell erstellen, aber überspringen Sie die manuelle Erstellung eines Containers, da CosmosDbPartitionedStorage den Container für Sie erstellt.

Nachdem Sie den Arbeitsspeicher verwendet haben, aktualisieren Sie nun den Code, um Azure Cosmos DB zu verwenden. Cosmos DB ist eine global verteilte Datenbank von Microsoft mit mehreren Modellen. Azure Cosmos DB ermöglicht es Ihnen, Durchsatz und Speicher elastisch und unabhängig voneinander über eine beliebige Anzahl von geografischen Azure-Regionen hinweg zu skalieren. Azure Cosmos DB bietet Ihnen mit umfassenden Vereinbarungen zum Servicelevel (Service Level Agreements, SLAs) Durchsatz-, Wartezeit-, Verfügbarkeits- und Konsistenzgarantien.

Einrichten einer Cosmos DB-Ressource

Zum Verwenden von Cosmos DB in Ihrem Bot müssen Sie eine Datenbankressource erstellen, bevor Sie in den Code einsteigen. Eine ausführliche Beschreibung der Cosmos-DB-Datenbank und der App-Erstellung finden Sie in der Schnellstartanleitung für .NET, Node.js oder Python.

Erstellen Ihres Datenbankkontos

  1. Wechseln Sie zum Azure-Portal, um ein Azure Cosmos DB-Konto zu erstellen. Suchen Sie nachAzure Cosmos DB.

  2. Wählen Sie auf der Seite Azure Cosmos DB die Option Neu aus, um die Seite Azure-Cosmos-DB-Konto erstellen anzuzeigen.

    Screenshot of creating your Cosmos DB account.

  3. Stellen Sie Werte für die folgenden Felder bereit:

    1. Abonnement. Wählen Sie das Azure-Abonnement aus, das Sie für dieses Azure Cosmos-Konto verwenden möchten.
    2. Ressourcengruppe. Wählen Sie eine vorhandene Ressourcengruppe aus oder wählen Sie Neu erstellen aus, und geben Sie einen Namen für eine neue Ressourcengruppe ein.
    3. Kontoname. Geben Sie einen Namen ein, der Ihr Azure Cosmos-Konto identifiziert. Da documents.azure.com an den Namen angefügt wird, die Sie für die URI-Erstellung angeben, muss der Name eindeutig sein. Beachten Sie die folgenden Richtlinien:
      • Der Name muss innerhalb von Azure eindeutig sein.
      • Der Name muss zwischen 3 und 31 Zeichen lang sein.
      • Der Name darf nur aus Kleinbuchstaben, Zahlen und Bindestrichen (-) bestehen.
    4. API. Wählen Sie Core (SQL) aus
    5. Standort. Wählen Sie einen Standort, der Ihren Benutzern am nächsten ist, damit sie möglichst schnell auf die Daten zugreifen können.
  4. Klicken Sie auf Überprüfen + erstellen.

  5. Klicken Sie nach der Validierung auf Erstellen.

Die Kontoerstellung dauert einige Minuten. Warten Sie, bis das Portal die Seite Herzlichen Glückwunsch! Ihr Azure Cosmos DB-Konto wurde erstellt anzeigt.

Hinzufügen einer Datenbank

Hinweis

Erstellen Sie den Container nicht selbst. Dies übernimmt Ihr Bot beim Erstellen des internen Cosmos DB-Clients. Hierbei wird auch sichergestellt, dass der Container zum Speichern des Botzustands richtig konfiguriert ist.

  1. Navigieren Sie unter Ihrem neu erstellten Cosmos DB-Konto zur Seite Daten-Explorer, und wählen Sie dann im Dropdownfeld Neuer Container die Option Neue Datenbank aus. Im rechten Teil des Fensters wird dann ein Bereich geöffnet, in dem Sie die Details für die neue Datenbank eingeben können.

    Screenshot of creating your Cosmos DB database.

  2. Geben Sie eine ID für Ihre neue Datenbank ein, und legen Sie optional den Durchsatz fest (kann später geändert werden). Klicken Sie abschließend auf OK, um Ihre Datenbank zu erstellen. Notieren Sie sich diese Datenbank-ID, da Sie sie später beim Konfigurieren Ihres Bots benötigen.

  3. Nachdem Sie nun ein Cosmos DB-Konto und eine Datenbank erstellt haben, müssen Sie einige Werte für die Integration Ihrer neuen Datenbank in Ihren Bot kopieren. Navigieren Sie zum Abrufen der Werte in Ihrem Cosmos DB-Konto im Abschnitt mit den Datenbankeinstellungen zur Registerkarte Schlüssel. Auf dieser Seite benötigen Sie Ihre URI (Cosmos-DB-Endpunkt) und Ihren PRIMÄRSCHLÜSSEL (Autorisierungsschlüssel).

Sie sollten jetzt über ein Cosmos-DB-Konto mit einer Datenbank und den folgenden Werten verfügen, die in Ihren Bot-Einstellungen verwendet werden können.

  • URI
  • Primärschlüssel
  • Datenbank-ID

Hinzufügen von Cosmos-DB-Konfigurationsinformationen

Verwenden Sie die Angaben, die Sie sich im vorherigen Teil dieses Artikels notiert haben, um Ihren Endpunkt, den Autorisierungsschlüssel und die Datenbank-ID festzulegen. Abschließend sollten Sie einen geeigneten Namen für den Container auswählen, der in Ihrer Datenbank zum Speichern des Botzustands erstellt werden soll. Im folgenden Beispiel wird der erstellte Cosmos-DB-Container "bot-storage" genannt.

Fügen Sie Ihrer Konfigurationsdatei die folgenden Informationen hinzu:

appsettings.json

"CosmosDbEndpoint": "<your-CosmosDb-URI>",
"CosmosDbAuthKey": "<your-primary-key>",
"CosmosDbDatabaseId": "<your-database-id>",
"CosmosDbContainerId": "bot-storage"

Installieren von Cosmos-DB-Paketen

Stellen Sie sicher, dass Sie über die erforderlichen Pakete für Cosmos DB verfügen.

Installieren Sie das NuGet-Paket Microsoft.Bot.Builder.Azure. Weitere Informationen zur Verwendung von NuGet finden Sie unter Installieren und Verwalten von Paketen in Visual Studio mit dem NuGet-Paket-Manager.

Implementierung von Cosmos DB

Hinweis

In Version 4.6 wurde ein neuer Cosmos DB-Speicheranbieter eingeführt: die Klasse für partitionierten Cosmos DB-Speicher. Die Klasse für den ursprünglichen Cosmos DB-Speicher wurde als veraltet gekennzeichnet. Mit Cosmos DB-Speicher erstellte Container können mit partitioniertem Cosmos DB-Speicher verwendet werden. Weitere Informationen finden Sie unter Partitionierung in Azure Cosmos DB.

Der partitionierte Cosmos-DB-Speicher erstellt im Gegensatz zum älteren Cosmos-DB-Speicher nicht automatisch eine Datenbank in Ihrem Cosmos-DB-Konto. Sie müssen eine neue Datenbank manuell erstellen, aber überspringen Sie die manuelle Erstellung eines Containers, da CosmosDbPartitionedStorage den Container für Sie erstellt.

Der folgende Beispielcode wird mit dem gleichen Botcode ausgeführt wie das obige Beispiel für den Arbeitsspeicher, allerdings mit den hier aufgeführten Ausnahmen. Der unten stehende Codeausschnitt zeigt eine Implementierung von Cosmos-DB-Speicher für myStorage, die den lokalen Arbeitsspeicher ersetzt.

Sie müssen Startup.cs zuerst aktualisieren, um auf die Bot-Builder-Azure-Bibliothek zu verweisen:

using Microsoft.Bot.Builder.Azure;

Erstellen Sie als Nächstes in der ConfigureServices-Methode in Startup.cs das CosmosDbPartitionedStorage-Objekt. Dies wird über die Abhängigkeitsinjektion an den EchoBot-Konstruktor übergeben.

// Use partitioned CosmosDB for storage, instead of in-memory storage.
services.AddSingleton<IStorage>(
    new CosmosDbPartitionedStorage(
        new CosmosDbPartitionedStorageOptions
        {
            CosmosDbEndpoint = Configuration.GetValue<string>("CosmosDbEndpoint"),
            AuthKey = Configuration.GetValue<string>("CosmosDbAuthKey"),
            DatabaseId = Configuration.GetValue<string>("CosmosDbDatabaseId"),
            ContainerId = Configuration.GetValue<string>("CosmosDbContainerId"),
            CompatibilityMode = false,
        }));

Ändern Sie in EchoBot.cs die _myStorage-Variabledeklaration private static readonly MemoryStorage _myStorage = new MemoryStorage(); wie folgt:

// variable used to save user input to CosmosDb Storage.
private readonly IStorage _myStorage;

Geben Sie dann das IStorage-Objekt an den EchoBot-Konstruktor weiter:

public EchoBot(IStorage storage)
{
    if (storage is null) throw new ArgumentNullException();
    _myStorage = storage;
}

Starten Ihres Cosmos-DB-Bots

Führen Sie Ihren Bot lokal aus.

Testen des Cosmos-DB-Bots mit Bot Framework Emulator

Starten Sie nun den Bot Framework Emulator und verbinden Sie sich mit Ihrem Bot:

  1. Wählen Sie den Link Neue Bot-Konfiguration erstellen auf der Registerkarte Emulator Willkommen.
  2. Füllen Sie die Felder zur Verbindung mit Ihrem Bot mit den Daten aus, die beim Starten des Bots auf der Webseite angezeigt wurden.

Interagieren mit Ihrem Cosmos-DB-Bot

Senden Sie eine Nachricht an den Bot. Der Bot listet daraufhin die von ihm empfangenen Nachrichten auf.

A conversation with the bot that shows the bot keeping a list of messages from the user.

Anzeigen Ihrer Cosmos-DB-Daten

Nachdem Sie den Bot ausgeführt und Ihre Informationen gespeichert haben, können Sie die im Azure-Portal gespeicherten Daten auf der Registerkarte Daten-Explorer anzeigen.

Screenshot of the Data Explorer in the Azure portal.

Verwenden von Blob Storage

Azure Blob Storage ist die Objektspeicherlösung von Microsoft für die Cloud. Blobspeicher ist für die Speicherung großer Mengen von unstrukturierten Daten, z.B. Text oder Binärdaten, optimiert. In diesem Abschnitt wird erläutert, wie Sie ein Azure-Blob-Storage-Konto und einen Container erstellen und dann auf Ihren Blob-Storage-Container von Ihrem Bot verweisen.

Weitere Informationen zu Blob Storage finden Sie unter Was ist Azure Blob Storage?

Erstellen Ihres Blob Storage-Kontos

Um Blob Storage in Ihrem Bot verwenden zu können, müssen Sie einige Einrichtungsschritte durchführen, bevor wir uns mit dem Code befassen.

  1. Wählen Sie im Azure-Portal die Option Alle Dienste.

  2. Wählen Sie auf der Seite Alle Dienste im Abschnitt Empfohlen die Option Speicherkonten.

  3. Klicken Sie auf der Seite Speicherkonten auf Neu.

    Screenshot of creating an Azure Storage account.

  4. Wählen Sie im Feld Abonnement das Abonnement aus, in dem das Speicherkonto erstellt werden soll.

  5. Wählen Sie im Feld Ressourcengruppe eine vorhandene Ressourcengruppe aus, oder wählen Sie Neu erstellen aus, und geben Sie einen Namen für die neue Ressourcengruppe ein.

  6. Geben Sie im Feld Speicherkontoname einen Namen für das Konto ein. Beachten Sie die folgenden Richtlinien:

    • Der Name muss innerhalb von Azure eindeutig sein.
    • Der Name muss zwischen 3 und 24 Zeichen lang sein.
    • Der Name darf nur Ziffern und Kleinbuchstaben enthalten.
  7. Wählen Sie im Feld Standort einen Standort für das Speicherkonto aus, oder verwenden Sie den Standardstandort.

  8. Konfigurieren Sie für die übrigen Einstellungen die folgenden Werte:

  9. Wählen Sie im Abschnitt Projektdetails auf der Seite Speicherkonto erstellen die gewünschten Werte für Subscription und Ressourcengruppe aus.

  10. Geben Sie im Abschnitt Instancedetails auf der Seite Speicherkonto erstellen den Namen des Speicherkontos ein und wählen Sie dann Werte für Standort, Kontotyp und Replikation aus.

  11. Wählen Sie Überprüfen + erstellen aus, um die Speicherkontoeinstellungen zu überprüfen.

  12. Klicken Sie nach der Validierung auf Erstellen.

Erstellen eines Blob Storage-Containers

Nachdem Ihr Blob Storage-Konto erstellt wurde, öffnen Sie es wie folgt:

  1. Wählen Sie Speicher-Explorer (Vorschau) aus.

  2. Klicken Sie dann mit der rechten Maustaste auf BLOB-CONTAINER

  3. Wählen Sie Blobcontainer erstellen aus der Einblendliste.

    Screenshot of creating a blob container.

  4. Geben Sie einen Namen in das Formular Neuer Container ein. Sie verwenden diesen Namen als Wert für Ihren „Blob-Containernamen“, um den Zugriff auf Ihr Blob-Speicherkonto zu ermöglichen. Beachten Sie die folgenden Richtlinien:

    • Dieser Name darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten.
    • Dieser Name muss mit einem Buchstaben oder einer Zahl beginnen.
    • Vor und nach jedem Bindestrich muss ein gültiges Zeichen stehen, das kein Bindestrich ist.
    • Der Name muss zwischen 3 und 63 Zeichen lang sein.

Hinzufügen von Blob-Storage-Konfigurationsinformationen

Suchen Sie wie oben dargestellt nach den Blob-Storage-Schlüsseln, die Sie zum Konfigurieren von Blob Storage für Ihren Bot benötigen:

  1. Öffnen Sie im Azure-Portal Ihr Blob-Storage-Konto und wählen Sie im Abschnitt Einstellungen die Option Zugriffsschlüssel.
  2. Um Ihren Bot für den Zugriff auf Ihr Blob-Speicherkonto zu konfigurieren, verwenden Sie Verbindungszeichenfolge als Wert für die Blob-Verbindungszeichenfolge.

Fügen Sie Ihrer Konfigurationsdatei die folgenden Informationen hinzu:

appsettings.json

"BlobConnectionString": "<your-blob-connection-string>",
"BlobContainerName": "<your-blob-container-name>",

Installieren von Blob-Storage-Paketen

Falls noch nicht installiert, installieren Sie die folgenden Pakete.

Installieren Sie das NuGet-Paket Microsoft.Bot.Builder.Azure.Blobs. Weitere Informationen zur Verwendung von NuGet finden Sie unter Installieren und Verwalten von Paketen in Visual Studio mit dem NuGet-Paket-Manager.

Implementierung eines Blob Storage

Blob Storage wird verwendet, um Bot State zu speichern.

Hinweis

Ab der Version 4.10 ist Microsoft.Bot.Builder.Azure.AzureBlobStorage veraltet. Verwenden Sie das neue Microsoft.Bot.Builder.Azure.Blobs.BlobsStorage an seiner Stelle.

Der folgende Beispielcode wird mit dem gleichen Botcode ausgeführt wie das obige Beispiel für den Arbeitsspeicher, allerdings mit den hier aufgeführten Ausnahmen.

Die unten stehenden Codeschnipsel zeigen eine Implementierung von Blob Storage für myStorage, die den lokalen Arbeitsspeicher ersetzen.

Sie müssen Startup.cs zuerst aktualisieren, um auf die Bot-Builder-Azure-Blob-Bibliothek zu verweisen:

Startup.cs

using Microsoft.Bot.Builder.Azure.Blobs;

Erstellen Sie als Nächstes in der ConfigureServices-Methode in Startup.cs das BlobsStorage-Objekt und übergeben Sie die Werte aus appsettings.json. Dies wird über die Abhängigkeitsinjektion an den EchoBot-Konstruktor übergeben.

//Use Azure Blob storage, instead of in-memory storage.
services.AddSingleton<IStorage>(
    new BlobsStorage(
        Configuration.GetValue<string>("BlobConnectionString"),
        Configuration.GetValue<string>("BlobContainerName")
        ));

Sie müssen jetzt EchoBot.cs zuerst aktualisieren, um auf die Bot-Builder-Azure-Blob-Bibliothek zu verweisen:

EchoBot.cs

using Microsoft.Bot.Builder.Azure.Blobs;

Als Nächstes entfernen oder kommentieren Sie die Codezeile aus, die die MemoryStorage-Variable „private static readonly MemoryStorage _myStorage = new MemoryStorage();“ erstellt und erstellen Sie eine neue Variable, die zum Speichern von Benutzereingaben im Blob Storage verwendet wird.

EchoBot.cs

// variable used to save user input to CosmosDb Storage.
private readonly IStorage _myStorage;

Geben Sie dann das IStorage-Objekt an den EchoBot-Konstruktor weiter:

public EchoBot(IStorage storage)
{
    if (storage is null) throw new ArgumentNullException();
    _myStorage = storage;
}

Sobald „storage“ auf Ihr Blob Storage-Konto verweist, verwendet der Botcode zum Speichern und Abrufen von Daten Blob Storage.

Sobald „storage“ auf Ihr Blob Storage-Konto verweist, verwendet der Botcode zum Speichern und Abrufen von Daten Blob Storage.

Starten des Blob-Storage-Bots

Führen Sie Ihren Bot lokal aus.

Starten des Emulators und Herstellen einer Verbindung mit Ihrem Blob-Storage-Bot

Starten Sie im nächste Schritt den Emulator und stellen Sie dann im Emulator eine Verbindung mit Ihrem Bot her:

  1. Wählen Sie den Link Neue Bot-Konfiguration erstellen auf der Registerkarte Emulator „Willkommen“.
  2. Füllen Sie die Felder zur Verbindung mit Ihrem Bot mit den Daten aus, die beim Starten des Bots auf der Webseite angezeigt wurden.

Interagieren mit Ihrem Blob-Storage-Bot

Senden Sie eine Nachricht an den Bot. Der Bot listet daraufhin die von ihm empfangenen Nachrichten auf.

A conversation with the bot that shows the bot keeping a list of messages from the user.

Anzeigen ihrer Blob-Storage-Daten

Nachdem Sie den Bot ausgeführt und Ihre Informationen gespeichert haben, können Sie sie im Azure-Portal auf der Registerkarte Speicher-Explorer anzeigen.

Blob-Transkriptspeicher

Azure-Blob-Transkriptspeicher ist eine spezielle Speicheroption, die Ihnen auf einfache Weise das Speichern und Abrufen von Benutzerkonversationen in Form eines aufgezeichneten Transkripts ermöglicht. Azure-Blob-Transkriptspeicher eignet sich für die automatische Erfassung von Benutzereingaben, die dann beim Debuggen zum Untersuchen der Leistung des Bots verwendet werden können.

Hinweis

Python unterstützt derzeit keinen Azure-Blob-Transkriptspeicher. Während JavaScript Blob-Transkriptspeicher unterstützt, gelten die folgenden Anweisungen nur für C#.

Einrichten eines Blob-Transkriptspeichercontainers

Für Azure-Blob-Transkriptspeicher kann das Blob Storage-Konto verwendet werden, das Sie in den obigen Abschnitten Erstellen Ihres Blob Storage-Kontos und Hinzufügen der Konfigurationsinformationen erstellt haben. Jetzt fügen Sie einen Container zum Speichern der Transkripte hinzu.

Screenshot of creating a blob container to use as a transcript store.

  1. Öffnen Sie Ihr Azure Blob Storage-Konto.
  2. Auswählen des Speicher-Explorers.
  3. Klicken Sie mit der rechten Maustaste auf BLOB-CONTAINER, und wählen Sie BLOB-Container erstellen aus.
  4. Geben Sie einen Namen für den Transkriptcontainer ein und wählen Sie dann OK aus. (In diesem Beispiel wurde der Name mybottranscripts eingegeben.)

Implementierung des Blob-Transkriptspeichers

Der folgende Code verbindet den Zeiger für den Transkriptspeicher _myTranscripts mit Ihrem neuen Azure-Blob-Transkriptspeicherkonto. Um diesen Link mit einem neuen Containernamen, <your-blob-transcript-container-name>, zu erstellen, wird in Blob Storage ein neuer Container zum Speichern der Transkriptdateien erstellt.

Blob-Transkriptspeicher dient zum Speichern von Bot-Transkripten.

Hinweis

Ab der Version 4.10 ist Microsoft.Bot.Builder.Azure.AzureBlobTranscriptStore veraltet. Verwenden Sie das neue Microsoft.Bot.Builder.Azure.Blobs.BlobsTranscriptStore an seiner Stelle.

echoBot.cs

using Microsoft.Bot.Builder.Azure.Blobs;

public class EchoBot : ActivityHandler
{
   ...

   private readonly BlobsTranscriptStore _myTranscripts = new BlobsTranscriptStore("<your-azure-storage-connection-string>", "<your-blob-transcript-container-name>");

   ...
}

Speichern von Benutzerkonversationen in Azure-Blob-Transkripts

Sobald ein Blobcontainer zum Speichern von Transkripts verfügbar ist, können Sie beginnen, die Konversationen Ihrer Benutzer mit dem Bot zu speichern. Diese Konversationen können später zum Debuggen verwendet werden, um festzustellen, wie Benutzer mit Ihrem Bot interagieren. Jeder Neustart der Konversation im Emulator initiiert die Erstellung einer neuen Liste mit dem Konversationstranskript. Der folgende Code speichert Benutzereingaben im Rahmen der Konversation in einer gespeicherten Transkriptdatei.

  • Das aktuelle Transkript wird mithilfe von LogActivityAsync gespeichert.
  • Gespeicherte Transkripte werden mithilfe von ListTranscriptsAsync abgerufen. In diesem Beispiel wird die ID jedes gespeicherten Transkripts in einer Liste mit dem Namen „storedTranscripts“ gespeichert. Mithilfe dieser Liste wird später die Anzahl gespeicherter Blob-Transkripte verwaltet, die beibehalten werden.

echoBot.cs


protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    await _myTranscripts.LogActivityAsync(turnContext.Activity);

    List<string> storedTranscripts = new List<string>();
    PagedResult<Microsoft.Bot.Builder.TranscriptInfo> pagedResult = null;
    var pageSize = 0;
    do
    {
       pagedResult = await _myTranscripts.ListTranscriptsAsync("emulator", pagedResult?.ContinuationToken);
       pageSize = pagedResult.Items.Count();

       // transcript item contains ChannelId, Created, Id.
       // save the channelIds found by "ListTranscriptsAsync" to a local list.
       foreach (var item in pagedResult.Items)
       {
          storedTranscripts.Add(item.Id);
       }
    } while (pagedResult.ContinuationToken != null);

    ...
}

Verwalten der gespeicherten Blob-Transkripte

Gespeicherte Transkripte sind zwar hilfreich beim Debuggen, im Laufe der Zeit kann die Anzahl gespeicherter Transkripte jedoch Ihre Speicherkapazität übersteigen. Im folgenden zusätzlichen Code wird DeleteTranscriptAsync verwendet, um bis auf die drei zuletzt abgerufenen Transkriptelemente alle Transkripte aus dem Blob-Transkriptspeicher zu löschen.

echoBot.cs


protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    await _myTranscripts.LogActivityAsync(turnContext.Activity);

    List<string> storedTranscripts = new List<string>();
    PagedResult<Microsoft.Bot.Builder.TranscriptInfo> pagedResult = null;
    var pageSize = 0;
    do
    {
       pagedResult = await _myTranscripts.ListTranscriptsAsync("emulator", pagedResult?.ContinuationToken);
       pageSize = pagedResult.Items.Count();

       // transcript item contains ChannelId, Created, Id.
       // save the channelIds found by "ListTranscriptsAsync" to a local list.
       foreach (var item in pagedResult.Items)
       {
          storedTranscripts.Add(item.Id);
       }
    } while (pagedResult.ContinuationToken != null);

    // Manage the size of your transcript storage.
    for (int i = 0; i < pageSize; i++)
    {
       // Remove older stored transcripts, save just the last three.
       if (i < pageSize - 3)
       {
          string thisTranscriptId = storedTranscripts[i];
          try
          {
             await _myTranscripts.DeleteTranscriptAsync("emulator", thisTranscriptId);
           }
           catch (System.Exception ex)
           {
              await turnContext.SendActivityAsync("Debug Out: DeleteTranscriptAsync had a problem!");
              await turnContext.SendActivityAsync("exception: " + ex.Message);
           }
       }
    }
    ...
}

Weitere Informationen zur Klasse finden Sie unter Blob-Transkriptspeicher von Azure.

Zusätzliche Informationen

Verwalten von Parallelität mit eTags

In unserem Botcodebeispiel legen Sie die eTag-Eigenschaft jedes IStoreItem auf * fest. Der eTag-Member (Entitätstag) Ihres Speicherobjekts wird in Cosmos DB zum Verwalten der Parallelität verwendet. Das eTag teilt Ihrer Datenbank mit, wie vorzugehen ist, wenn eine andere Instanz des Bots das Objekt in demselben Speicher geändert hat, in den der Bot schreibt.

Der letzte Schreibzugriff gewinnt: Überschreiben zulassen

Wenn der Eigenschaftenwert von eTag das Sternchen (*) ist, zeigt dies an, dass der letzte Schreibvorgang gewinnt. Wenn Sie einen neuen Datenspeicher erstellen, können Sie das eTag einer Eigenschaft auf * festlegen, um anzugeben, dass Sie die Daten, die Sie schreiben, noch nicht gespeichert haben, oder dass der letzte Schreibvorgang eine zuvor gespeicherte Eigenschaft überschreiben soll. Wenn die Parallelität für Ihren Bot kein Problem darstellt, erlaubt das Festlegen der eTag-Eigenschaft auf * für alle Daten, die Sie schreiben, das Überschreiben.

Verwalten von Parallelität und Verhindern von Überschreibungen

Verwenden Sie beim Speichern Ihrer Daten in Cosmos DB einen anderen Wert als * für das eTag, wenn Sie den gleichzeitigen Zugriff auf eine Eigenschaft und das Überschreiben von Änderungen von einer anderen Instanz des Bots verhindern möchten. Der Bot erhält eine Fehlerantwort mit der Meldung etag conflict key=, wenn er versucht, Zustandsdaten zu speichern und das eTag weist nicht denselben Wert auf wie das eTag im Speicher.

Die eTag-Eigenschaft eines Speicherobjekts wird von Cosmos DB standardmäßig jedes Mal auf Gleichheit überprüft, wenn ein Bot in dieses Element schreibt, und nach jedem Schreibvorgang auf einen neuen eindeutigen Wert aktualisiert. Wenn die eTag-Eigenschaft beim Schreiben nicht mit der Eigenschaft eTag im Speicher übereinstimmt, bedeutet dies, dass ein anderer Bot oder Thread die Daten geändert hat.

Angenommen, Sie möchten, dass Ihr Bot eine gespeicherte Notiz bearbeitet, aber Sie möchten nicht, dass Ihr Bot Änderungen überschreibt, die eine andere Instanz des Bots vorgenommen hat. Wenn eine andere Instanz des Bots Bearbeitungen vorgenommen hat, möchten Sie, dass der Benutzer die Version mit den neuesten Aktualisierungen bearbeitet.

Erstellen Sie zunächst eine Klasse, die IStoreItem implementiert.

EchoBot.cs

public class Note : IStoreItem
{
    public string Name { get; set; }
    public string Contents { get; set; }
    public string ETag { get; set; }
}

Erstellen Sie anschließend eine erste Notiz, indem Sie ein Speicherobjekt erstellen, und fügen Sie das Objekt Ihrem Speicher hinzu.

EchoBot.cs

// create a note for the first time, with a non-null, non-* ETag.
var note = new Note { Name = "Shopping List", Contents = "eggs", ETag = "x" };

var changes = Dictionary<string, object>();
{
    changes.Add("Note", note);
};
await NoteStore.WriteAsync(changes, cancellationToken);

Greifen Sie dann später auf die Notiz zu, und aktualisieren Sie sie, indem Sie ihr eTag, das Sie aus dem Speicher gelesen haben, beibehalten.

EchoBot.cs

var note = NoteStore.ReadAsync<Note>("Note").Result?.FirstOrDefault().Value;

if (note != null)
{
    note.Contents += ", bread";
    var changes = new Dictionary<string, object>();
    {
         changes.Add("Note1", note);
    };
    await NoteStore.WriteAsync(changes, cancellationToken);
}

Wenn die Notiz im Speicher aktualisiert wurde, bevor Sie Ihre Änderungen schreiben, löst der Aufruf von Write eine Ausnahme aus.

Um die Parallelität zu verwalten, lesen Sie immer eine Eigenschaft aus dem Speicher, und ändern Sie die Eigenschaft dann, die Sie gelesen haben, sodass das eTag beibehalten wird. Wenn Sie Benutzerdaten aus dem Speicher lesen, enthält die Antwort die eTag-Eigenschaft. Wenn Sie die Daten ändern und aktualisierte Daten in den Speicher schreiben, sollte Ihre Anforderung die eTag-Eigenschaft enthalten, die den gleichen Wert angibt, den Sie zuvor gelesen haben. Das Schreiben eines Objekts, dessen eTag auf * festgelegt ist, erlaubt es dem Schreibvorgang jedoch, alle anderen Änderungen zu überschreiben.

Nächste Schritte

Da Sie nun wissen, wie Sie direkt aus dem Speicher lesen und in ihn schreiben können, schauen wir uns an, wie der Zustands-Manager diese Aufgabe für Sie übernehmen kann.