Direktes Schreiben in den SpeicherWrite directly to storage

gilt für: SDK v4APPLIES TO: SDK v4

Sie können ohne Verwendung eines Middleware- oder Kontextobjekts direkt aus Ihrem Speicherobjekt lesen und in das Speicherobjekt schreiben.You can read and write directly to your storage object without using middleware or context object. 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.This can be appropriate for data your bot uses to preserve a conversation, or data that comes from a source outside your bot's conversation flow. Bei diesem Datenspeichermodell werden Daten direkt aus dem Speicher gelesen, anstatt einen Zustands-Manager zu verwenden.In this data storage model, data is read in directly from storage instead of using a state manager. Die Codebeispiele in diesem Artikel zeigen, wie Sie Daten mithilfe von Speicher, Cosmos DB, Azure Blob und Azure Blob Transcript Storage in den Speicher lesen und schreiben.The code examples in this article show you how to read and write data to storage using memory, Cosmos DB, Azure Blob, and Azure Blob transcript storage.

VoraussetzungenPrerequisites

Hinweis

Das VSIX -Paket umfasst sowohl .net Core 2,1-als auch .net Core 3,1-Versionen der c#-Vorlagen.The VSIX package includes both .NET Core 2.1 and .NET Core 3.1 versions of the C# templates. Sie sollten beim Erstellen neuer Bots in Visual Studio 2019 die .NET Core 3.1-Vorlagen verwenden.When creating new bots in Visual Studio 2019, you should use the .NET Core 3.1 templates. Für die aktuellen Botbeispiele werden .NET Core 3.1-Vorlagen verwendet.The current bot samples use .NET Core 3.1 templates. Beispiele mit .NET Core 2.1-Vorlagen finden Sie im Branch 4.7-archive des Repositorys BotBuilder-Samples.You can find the samples that use .NET Core 2.1 templates in the 4.7-archive branch of the BotBuilder-Samples repository. Informationen zum Bereitstellen von .net Core 3,1-Bots in Azure finden Sie unter Bereitstellen Ihres bot in Azure.For information about deploying .NET Core 3.1 bots to Azure, see how to deploy your bot to Azure.

Informationen zu diesem BeispielAbout this sample

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).The sample code in this article begins with the structure of a basic echo bot, then extends that bot's functionality by adding additional code (provided below). Dieser erweiterte Code erstellt eine Liste, um empfangene Benutzereingaben beizubehalten.This extended code creates a list to preserve user inputs as they are received. Bei jedem Turn wird die vollständige Liste der Benutzereingaben, die im Arbeitsspeicher gespeichert sind, an den Benutzer zurückgezahlt.Each turn, the full list of user inputs, saved to memory, is echoed back to the user. Die Datenstruktur, die diese Liste von Eingaben enthält, wird dann geändert, um sie im Speicher zu speichern.The data structure containing this list of inputs is then modified to save to storage. Verschiedene Speichertypen werden untersucht, wenn diesem Beispielcode zusätzliche Funktionen hinzugefügt werden.Various types of storage are explored as additional functionality is added to this sample code.

ArbeitsspeicherMemory storage

Mit dem Bot Framework SDK können Sie Benutzereingaben in In-Memory-Speicher speichern.The Bot Framework SDK allows you to store user inputs using in-memory storage. Da der In-Memory-Speicher bei jedem Neustart des Bots gelöscht wird, eignet er sich am besten für Testzwecke und ist nicht für die Verwendung in der Produktion vorgesehen.Since in-memory storage is cleared each time the bot is restarted, it is best suited for testing purposes and is not intended for production use. Für Bots in Produktionsumgebungen sollten permanente Speichertypen wie etwa Datenbankspeicher verwendet werden.Persistent storage types, such as database storage, are best for production bots.

Erstellen eines einfachen BotsBuild a basic bot

Die restlichen Abschnitte dieses Themas basieren auf einem Echobot.The rest of this topic builds off of an Echo bot. Der Echo-Bot-Beispielcode kann lokal erstellt werden, indem Sie die Schnellstartanweisungen zum Erstellen des EchoBots in C#, JavaScript oder Python befolgen.The Echo bot sample code can be locally built by following the Quickstart instructions for building the EchoBot in either C#, JavaScript or Python.

Ersetzen Sie den Code in EchoBot.cs durch den folgenden Code:Replace the code in EchoBot.cs with the following 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 BotsStart your bot

Führen Sie Ihren Bot lokal aus.Run your bot locally.

Starten des Emulators und Herstellen einer Verbindung mit Ihrem BotStart the Emulator and connect your bot

Installieren Sie den Bot Framework Emulator Weiter, starten Sie den Emulator, und stellen Sie dann eine Verbindung mit Ihrem Bot im Emulator her:Install the Bot Framework Emulator Next, start the Emulator and then connect to your bot in the Emulator:

  1. Wählen Sie auf der Registerkarte Willkommen des Emulators den Link Neue Botkonfiguration erstellen aus.Select the Create new bot configuration link in the Emulator Welcome tab.
  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.Fill in fields to connect to your bot, given the information on the webpage displayed when you started your bot.

Interagieren mit Ihrem BotInteract with your bot

Senden Sie eine Nachricht an den Bot.Send a message to your bot. Der Bot listet die empfangenen Nachrichten auf.The bot will list the messages it has received.

Testen des Speicherbots im Emulator

Im weiteren Verlauf dieses Artikels wird veranschaulicht, wie Sie im persistenten Speicher anstelle des internen Speichers des Bots speichern.The remainder of this article will demonstrate how to save to persistent storage instead of the bot's internal memory.

Verwenden von Cosmos DBUsing Cosmos DB

Wichtig

Die Klasse Cosmos DB-Speicher wurde als veraltet gekennzeichnet.The Cosmos DB storage class has been deprecated. Für Container, die ursprünglich mit CosmosDbStorage erstellt wurden, wurde kein Partitionsschlüssel festgelegt, und der Standardpartitionsschlüssel / _partitionKey wurde erhalten.Containers originally created with CosmosDbStorage had no partition key set, and were given the default partition key of _/partitionKey.

Container, die mit Cosmos DB Speicher erstellt wurden, können mit Cosmos DB partitionierten Speicher verwendet werden.Containers created with Cosmos DB storage can be used with Cosmos DB partitioned storage. Weitere Informationen finden Sie unter Partitionierung in Azure Cosmos DB.Read Partitioning in Azure Cosmos DB for more information.

Beachten Sie außerdem, dass der Cosmos DB partitionierten Speicher im Gegensatz zum Legacyspeicher Cosmos DB nicht automatisch eine Datenbank in Ihrem Cosmos DB-Konto erstellt.Also note that, unlike the legacy Cosmos DB storage, the Cosmos DB partitioned storage does not automatically create a database within your Cosmos DB account. Sie müssen eine neue Datenbank manuell erstellen,aber überspringen Sie die manuelle Erstellung eines Containers, da CosmosDbPartitionedStorage den Container für Sie erstellt.You need to create a new database manually, but skip manually creating a container since CosmosDbPartitionedStorage will create the container for you.

Nachdem Sie den Arbeitsspeicher verwendet haben, aktualisieren Sie nun den Code, um Azure Cosmos DB zu verwenden.Now that you've used memory storage, we'll update the code to use Azure Cosmos DB. Cosmos DB ist eine global verteilte Datenbank von Microsoft mit mehreren Modellen.Cosmos DB is Microsoft's globally distributed, multi-model database. 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 enables you to elastically and independently scale throughput and storage across any number of Azure's geographic regions. Azure Cosmos DB bietet Ihnen mit umfassenden Vereinbarungen zum Servicelevel (Service Level Agreements, SLAs) Durchsatz-, Wartezeit-, Verfügbarkeits- und Konsistenzgarantien.It offers throughput, latency, availability, and consistency guarantees with comprehensive service level agreements (SLAs).

Einrichten einer Cosmos DB-RessourceSet up a Cosmos DB resource

Zum Verwenden von Cosmos DB in Ihrem Bot müssen Sie eine Datenbankressource erstellen, bevor Sie in den Code einsteigen.To use Cosmos DB in your bot, you'll need to create a database resource before getting into the code. Eine ausführliche Beschreibung Cosmos DB Datenbank- und App-Erstellung finden Sie in der Schnellstartanleitung für .NET, Node.js oder Python.For an in-depth description of Cosmos DB database and app creation, see the quickstart for .Net, Node.js or Python.

Erstellen Ihres DatenbankkontosCreate your database account

  1. Wechseln Sie zum Azure-Portal, um ein Azure Cosmos DB-Konto zu erstellen.Go to the Azure portal to create an Azure Cosmos DB account. Suchen Sie nach Azure Cosmos DB, und wählen Sie die Option aus.Search for and select Azure Cosmos DB.

  2. Wählen Sie auf der seite Azure Cosmos DB die Option Neu aus, um die Seite Azure Cosmos DB Konto erstellen aufzurufen.In the Azure Cosmos DB page, select New to bring up the the Create Azure Cosmos DB Account page.

    Erstellen eines Cosmos DB-Datenbankkontos

  3. Geben Sie Werte für die folgenden Felder an:Provide values for the following fields:

    1. Abonnement:Subscription. Wählen Sie das Azure-Abonnement aus, das Sie für dieses Azure Cosmos-Konto verwenden möchten.Select the Azure subscription that you want to use for this Azure Cosmos account.
    2. Ressourcengruppe.Resource group. 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.Select an existing resource group or select Create new, and enter a name for a new resource group.
    3. Kontoname.Account name. Geben Sie einen Namen ein, der Ihr Azure Cosmos-Konto identifiziert.Enter a name to identify your Azure Cosmos account. Da documents.azure.com an den Namen angefügt wird, die Sie für die URI-Erstellung angeben, muss der Name eindeutig sein.Because documents.azure.com is appended to the name that you provide to create your URI, use a unique name. Beachten Sie die folgenden Richtlinien:Note the following guidelines:
      • Der Name muss innerhalb von Azure eindeutig sein.The name must be unique across Azure.
      • Der Name muss zwischen drei und 31 Zeichen lang sein.The name must be between three and 31 characters long.
      • Der Name darf nur Kleinbuchstaben, Zahlen und den Bindestrich (-) enthalten.The name can include only lowercase letters, numbers, and the hyphen (-) character.
    4. API .API. Wählen Sie Core(SQL) aus.Select Core(SQL)
    5. Speicherort:Location. Wählen Sie einen Standort aus, der Ihren Benutzern am nächsten liegt, um ihnen den schnellsten Zugriff auf die Daten zu gewähren.select a location that is closest to your users to give them the fastest access to the data.
  4. Klicken Sie auf Überprüfen + erstellen.Select Review + Create.

  5. Wählen Sie nach der Überprüfung Erstellen aus.Once validated, select Create.

Die Kontoerstellung dauert einige Minuten.The account creation takes a few minutes. Warten Sie, bis das Portal die Seite Herzlichen Glückwunsch! Ihr Azure Cosmos DB-Konto wurde erstellt anzeigt.Wait for the portal to display the Congratulations! Your Azure Cosmos DB account was created page.

Hinzufügen einer DatenbankAdd a database

Hinweis

Sie sollten den Container nicht selbst erstellen.You should not create the container yourself. 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.Your bot will create it for you when creating its internal Cosmos DB client, ensuring it is configured correctly for storing bot state.

  1. Navigieren Sie in Ihrem neu erstellten Cosmos DB-Konto zur Seite Daten-Explorer, und wählen Sie dann in der Dropdown-Dropdownseite Neuer Container die Option Neue Datenbank aus.Navigate to the Data Explorer page within your newly created Cosmos DB account, then choose New Database from the New Container drop-down. Im rechten Teil des Fensters wird dann ein Bereich geöffnet, in dem Sie die Details für die neue Datenbank eingeben können.A panel will then open on the right hand side of the window, where you can enter the details for the new database.

    Erstellen Cosmos DB Datenbankressourcenimages

  2. Geben Sie eine ID für Ihre neue Datenbank ein, legen Sie optional den Durchsatz fest (sie können dies später ändern), und klicken Sie abschließend auf OK, um die Datenbank zu erstellen.Enter an ID for your new database and, optionally, set the throughput (you can change this later) and finally select OK to create your database. Notieren Sie sich diese Datenbank-ID, da Sie sie später beim Konfigurieren Ihres Bots benötigen.Make a note of this database ID for use later on when configuring your bot.

  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.Now that you have created a Cosmos DB account and a database, you need to copy over some of the values for integrating your new database into your bot. Navigieren Sie zum Abrufen der Werte in Ihrem Cosmos DB-Konto im Abschnitt mit den Datenbankeinstellungen zur Registerkarte Schlüssel.To retrieve these, navigate to the Keys tab within the database settings section of your Cosmos DB account. Auf dieser Seite benötigen Sie Ihren URI (Cosmos DB Endpunkt) und Ihren PRIMÄRSCHLÜSSEL (Autorisierungsschlüssel).From this page you will need your URI (Cosmos DB endpoint) and your PRIMARY KEY (authorization key).

    Cosmos DB-Schlüssel

Sie sollten nun über ein Cosmos DB mit einer Datenbank und den folgenden Werten verfügen, die in Ihren Boteinstellungen verwendet werden können.You should now have a Cosmos DB account with a database and the following values ready to use in your bot settings.

  • URIURI
  • PrimärschlüsselPrimary Key
  • Datenbank-IDDatabase ID

Hinzufügen Cosmos DB KonfigurationsinformationenAdd Cosmos DB configuration information

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.Use the details you made a note of in the previous part of this article to set your endpoint, authorization key and database ID. Abschließend sollten Sie einen geeigneten Namen für den Container auswählen, der in Ihrer Datenbank zum Speichern des Botzustands erstellt werden soll.Finally, you should choose an appropriate name for the container that will be created within your database to store your bot state. Im folgenden Beispiel wird Cosmos DB erstellte Container "bot-storage" genannt.In the example below the Cosmos DB container that is created will be named "bot-storage".

Fügen Sie Ihrer Konfigurationsdatei die folgenden Informationen hinzu:Add the following information to your configuration file.

appsettings.jsonappsettings.json

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

Installieren Cosmos DB PaketenInstalling Cosmos DB packages

Stellen Sie sicher, dass Sie über die erforderlichen Pakete für Cosmos DB verfügen.Make sure you have the packages necessary for Cosmos DB.

Installieren Sie das NuGet-Paket Microsoft.Bot.Builder.Azure.Install the Microsoft.Bot.Builder.Azure NuGet package. Weitere Informationen zur Verwendung von NuGet finden Sie unter Install and manage packages in Visual Studio using the NuGet Paket-Manager .For more information on using NuGet, see Install and manage packages in Visual Studio using the NuGet Package Manager .

Cosmos DB-ImplementierungCosmos DB implementation

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.Version 4.6 introduced a new Cosmos DB storage provider, the Cosmos DB partitioned storage class, and the original Cosmos DB storage class is deprecated. Container, die mit Cosmos DB-Speicher erstellt wurden, können mit Cosmos DB partitionierten Speicher verwendet werden.Containers created with Cosmos DB storage can be used with Cosmos DB partitioned storage. Weitere Informationen finden Sie unter Partitionierung in Azure Cosmos DB.Read Partitioning in Azure Cosmos DB for more information.

Beachten Sie Cosmos DB auch, dass der Cosmos DB im Gegensatz zum Legacyspeicher nicht automatisch eine Datenbank in Ihrem Cosmos DB erstellt.Also note that, unlike the legacy Cosmos DB storage, the Cosmos DB partitioned storage does not automatically create a database within your Cosmos DB account. Sie müssen manuell eine neueDatenbank erstellen, aber das manuelle Erstellen eines Containers überspringen, da CosmosDbPartitionedStorage den Container für Sie erstellt.You need to create a new database manually, but skip manually creating a container since CosmosDbPartitionedStorage will create the container for you.

Der folgende Beispielcode wird mit demselben Botcode wie das oben bereitgestellte Speicherbeispiel ausgeführt, mit den hier aufgeführten Ausnahmen. The following sample code runs using the same bot code as the memory storage sample provided above, with the exceptions listed here. Die folgenden Codeausschnitte zeigen eine Implementierung Cosmos DB Speichers für "myStorage", der den lokalen Speicher des Arbeitsspeichers ersetzt.The code snippets below show an implementation of Cosmos DB storage for 'myStorage' that replaces local Memory storage.

Zunächst müssen Sie Startup.cs aktualisieren, um auf die Azure-Bibliothek des Bot-Generators zu verweisen:You first need to update Startup.cs to reference the bot builder Azure library:

using Microsoft.Bot.Builder.Azure;

Erstellen Sie als Nächstes ConfigureServices in der -Methode in Startup.cs das CosmosDbPartitionedStorage -Objekt.Next, in the ConfigureServices method in Startup.cs, create the CosmosDbPartitionedStorage object. Diese wird durch Abhängigkeitsinjektion EchoBot an den Konstruktor übergeben.This will be passed into the EchoBot constructor through dependency injection.

// 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 Variablendeklaration wie private static readonly MemoryStorage _myStorage = new MemoryStorage(); folgt:In EchoBot.cs change the _myStorage variable declaration private static readonly MemoryStorage _myStorage = new MemoryStorage(); to the following:

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

Übergeben Sie dann das IStorage -Objekt an den EchoBot Konstruktor:Then pass in the IStorage object to the EchoBot constructor:

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

Starten Ihres Cosmos DB BotsStart your Cosmos DB bot

Führen Sie Ihren Bot lokal aus.Run your bot locally.

Testen Ihres Cosmos DB-Bots mit Bot Framework EmulatorTest your Cosmos DB bot with Bot Framework Emulator

Starten Sie nun die Bot Framework Emulator, und stellen Sie eine Verbindung mit Ihrem Bot herstellen:Now start the Bot Framework Emulator and connect to your bot:

  1. Wählen Sie auf der Registerkarte Emulator welcome (Emulator-Willkommen) den Link Create a new bot configuration (Neuen Bot erstellen) aus.Select the create a new bot configuration link in the Emulator Welcome tab.
  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.Fill in fields to connect to your bot, given the information on the webpage displayed when you started your bot.

Interagieren mit Ihrem Cosmos DB BotInteract with your Cosmos DB bot

Senden Sie eine Nachricht an den Bot. Der Bot listet daraufhin die von ihm empfangenen Nachrichten auf.Send a message to your bot, and the bot will list the messages it received. Ausgeführter EmulatorEmulator running

Anzeigen Ihrer Cosmos DB DatenView your Cosmos DB data

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.After you have run your bot and saved your information, we can view the data stored in the Azure portal under the Data Explorer tab.

Beispiel für die Anzeige im Daten-Explorer

Verwenden von Blob StorageUsing Blob storage

Azure Blob Storage ist die Objektspeicherlösung von Microsoft für die Cloud.Azure Blob storage is Microsoft's object storage solution for the cloud. Blobspeicher ist für die Speicherung großer Mengen von unstrukturierten Daten, z.B. Text oder Binärdaten, optimiert.Blob storage is optimized for storing massive amounts of unstructured data, such as text or binary data. In diesem Abschnitt wird erläutert, wie Sie ein Azure Blob Storage-Konto und einen Container erstellen und dann von Ihrem Bot aus auf Ihren Blobspeichercontainer verweisen.This section explains how to create an Azure blob storage account and container, then how to reference your blob storage container from your bot.

Weitere Informationen zu Blob Storage finden Sie unter Was ist Azure Blob Storage?For additional information on Blob Storage, see What is Azure Blob storage?

Erstellen Ihres Blob Storage-KontosCreate your Blob storage account

Um Blob Storage in Ihrem Bot verwenden zu können, müssen Sie einige Einrichtungsschritte durchführen, bevor wir uns mit dem Code befassen.To use Blob storage in your bot, you'll need to get a few things set up before getting into the code.

  1. Wählen Sie im Azure-Portal die Option Alle Dienste.In the Azure portal, select All services.

  2. Wählen Sie im Abschnitt Ausgewählte der Seite Alle Dienste die Option Speicherkonten aus.In the Featured section of the All services page, select Storage accounts.

  3. Wählen Sie auf der Seite Speicherkonten die Option Neu aus.In the Storage accounts page, select **New****.

    Seite "Blob-Speicherkonto erstellen"

  4. Wählen Sie im Feld Abonnement das Abonnement aus, in dem das Speicherkonto erstellt werden soll.In the Subscription field, select the subscription in which to create the storage account.

  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.In the Resource group field, select an existing resource group or select Create new, and enter a name for the new resource group.

  6. Geben Sie im Feld Speicherkontoname einen Namen für das Konto ein.In the Storage account name field, enter a name for the account. Beachten Sie die folgenden Richtlinien:Note the following guidelines:

    • Der Name muss innerhalb von Azure eindeutig sein.The name must be unique across Azure.
    • Der Name muss zwischen drei und 24 Zeichen lang sein.The name must be between three and 24 characters long.
    • Der Name darf nur Ziffern und Kleinbuchstaben enthalten.The name can include only numbers and lowercase letters.
  7. Wählen Sie im Feld Standort einen Standort für das Speicherkonto aus, oder verwenden Sie den Standardstandort.In the Location field, select a location for the storage account, or use the default location.

  8. Konfigurieren Sie für die übrigen Einstellungen die folgenden Werte:For the rest of the settings, configure the following:

  9. Wählen Sie im Abschnitt Projektdetails der Seite Speicherkonto erstellen die gewünschten Werte für Abonnement und Ressourcengruppe aus.In the Project details section of the Create storage account page, select the desired values for subscription and Resource group.

  10. Geben Sie im Abschnitt Instanzdetails der Seite Speicherkonto erstellen den Namen des Speicherkontos ein, und wählen Sie dann Werte für Standort, Kontoart und Replikation aus.In the Instance details section of the Create storage account page, enter the Storage account name then select values for Location, Account kind and Replication.

  11. Wählen Sie Überprüfen + erstellen aus, um die Speicherkontoeinstellungen zu überprüfen.Select Review + create to review the storage account settings.

  12. Wählen Sie nach der Überprüfung Erstellen aus.Once validated, select Create.

Erstellen eines Blob Storage-ContainersCreate Blob storage container

Nachdem Ihr Blob Storage-Konto erstellt wurde, öffnen Sie es und dann:Once your Blob storage account is created, open it, then:

  1. Wählen Sie Storage-Explorer (Vorschau) aus.Select Storage Explorer (Preview).

  2. Klicken Sie dann mit der rechten Maustaste auf BLOBCONTAINER.Then right-click on BLOB CONTAINERS

  3. Wählen Sie in der Dropdownliste Blobcontainer erstellen aus.Select Create blob container from the drop-down list.

    Erstellen eines Blob Storage-Containers

  4. Geben Sie im Formular Neuer Container einen Namen ein.Enter a name in the New container form. Sie verwenden diesen Namen als Wert für "blob-storage-container-name", um Zugriff auf Ihr Blob Storage-Konto zu gewähren.You will use this name for the value of your "blob-storage-container-name" to provide access to your Blob storage account. Beachten Sie die folgenden Richtlinien:Note the following guidelines:

    • Dieser Name darf nur Kleinbuchstaben, Zahlen und Bindestriche enthalten.This name may only contain lowercase letters, numbers, and hyphens.
    • Dieser Name muss mit einem Buchstaben oder einer Zahl beginnen.This name must begin with a letter or a number.
    • Jedem Bindestrich muss ein gültiges Zeichen ohne Bindestrich vorangestellt werden.Each hyphen must be preceded and followed by a valid non-hyphen character.
    • Der Name muss zwischen drei und 63 Zeichen lang sein.The name must be between three and 63 characters long.

Hinzufügen von Blob Storage-KonfigurationsinformationenAdd Blob storage configuration information

Suchen Sie die Blobspeicherschlüssel, die Sie zum Konfigurieren von Blob Storage für Ihren Bot benötigen, wie oben gezeigt:Find the Blob storage keys you need to configure Blob storage for your bot as shown above:

  1. Öffnen Sie im Azure-Portal Ihr Blob Storage-Konto, und wählen Sie im Abschnitt Einstellungen die Option Zugriffsschlüssel aus.In the Azure portal, open your Blob storage account and select Access keys in the Settings section.

    Suchen nach Blobspeicherschlüsseln

Verwenden Sie Verbindungszeichenfolge als Wert für die Verbindungszeichenfolge , um Zugriff auf Ihr Blob Storage-Konto bereitzustellen.Use Connection string as the value for your "connection-string" to provide access to your Blob storage account.

Fügen Sie Ihrer Konfigurationsdatei die folgenden Informationen hinzu:Add the following information to your configuration file.

appsettings.jsonappsettings.json

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

Installieren von Blob Storage-PaketenInstalling Blob storage packages

Wenn sie nicht bereits installiert wurde, installieren Sie die folgenden Pakete.If not previously installed, install the following packages.

Installieren Sie das NuGet-Paket Microsoft.Bot.Builder.Azure.Blobs.Install the Microsoft.Bot.Builder.Azure.Blobs NuGet package. Weitere Informationen zur Verwendung von NuGet finden Sie unter Installieren und Verwalten von Paketen in Visual Studio mithilfe des NuGet-Paket-Manager.For more information on using NuGet, see Install and manage packages in Visual Studio using the NuGet Package Manager.

Blob Storage-ImplementierungBlob storage implementation

Blob Storage wird zum Speichern des Botzustands verwendet.Blob storage is used to store bot state.

Hinweis

Ab Version 4.10 Microsoft.Bot.Builder.Azure.AzureBlobStorage ist veraltet.As of version 4.10, Microsoft.Bot.Builder.Azure.AzureBlobStorage is deprecated. Verwenden Sie die neue Microsoft.Bot.Builder.Azure.Blobs.BlobsStorage an ihrer Stelle.Use the new Microsoft.Bot.Builder.Azure.Blobs.BlobsStorage in its place.

Der folgende Beispielcode wird mit dem gleichen Botcode wie das oben bereitgestellte Speicherbeispiel ausgeführt, mit den hier aufgeführten Ausnahmen.The following sample code runs using the same bot code as the memory storage sample provided above, with the exceptions listed here.

Die folgenden Codeausschnitte zeigen eine Implementierung von Blob Storage für "myStorage", die den lokalen Speicher ersetzt.The code snippets below show an implementation of Blob storage for 'myStorage' that replaces local Memory storage.

Zuerst müssen Sie Startup.cs aktualisieren, um auf die Azure Blobs-Bibliothek des Bot-Generators zu verweisen:You first need to update Startup.cs to reference the bot builder Azure blobs library:

Startup.csStartup.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 .Next, in the ConfigureServices method in Startup.cs, create the BlobsStorage object, passing in the values from appsettings.json. Dies wird EchoBot durch Abhängigkeitsinjektion an den Konstruktor übergeben.This will be passed into the EchoBot constructor through dependency injection.

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

Nun müssen Sie zuerst EchoBot.cs aktualisieren, um auf die Azure Blobs-Bibliothek des Bot-Generators zu verweisen:Now you first need to update EchoBot.cs to reference the bot builder Azure blobs library:

EchoBot.csEchoBot.cs

using Microsoft.Bot.Builder.Azure.Blobs;

Entfernen Oder kommentieren Sie als Nächstes die Codezeile aus, die die MemoryStorage-Variable "private static readonly MemoryStorage _myStorage = new MemoryStorage();" erstellt, und erstellen Sie eine neue Variable, die verwendet wird, um Benutzereingaben im Blob Storage zu speichern.Next, remove or comment out the line of code that creates the MemoryStorage variable 'private static readonly MemoryStorage _myStorage = new MemoryStorage();', and create a new variable that will be used to save user input to the Blob Storage.

EchoBot.csEchoBot.cs

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

Übergeben Sie dann das IStorage -Objekt an den EchoBot Konstruktor:Then pass in the IStorage object to the EchoBot constructor:

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

Sobald Ihr Speicher so festgelegt ist, dass er auf Ihr Blob Storage-Konto verweist, speichert Ihr Botcode jetzt Daten und ruft sie aus Blob Storage ab.Once your storage is set to point to your Blob Storage account, your bot code will now store and retrieve data from Blob storage.

Sobald Ihr Speicher so festgelegt ist, dass er auf Ihr Blob Storage-Konto verweist, speichert Ihr Botcode jetzt Daten und ruft sie aus Blob Storage ab.Once your storage is set to point to your Blob Storage account, your bot code will now store and retrieve data from Blob storage.

Starten Ihres Blob Storage-BotsStart your Blob storage bot

Führen Sie Ihren Bot lokal aus.Run your bot locally.

Starten des Emulators und Herstellen einer Verbindung mit Ihrem Blob Storage-BotStart the Emulator and connect your Blob storage bot

Starten Sie als Nächstes den Emulator, und stellen Sie dann eine Verbindung mit Ihrem Bot im Emulator her:Next, start the Emulator and then connect to your bot in the Emulator:

  1. Wählen Sie auf der Registerkarte "Willkommen" des Emulators den Link Create new bot configuration (Neuen Bot erstellen) aus.Select the Create new bot configuration link in the Emulator "Welcome" tab.
  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.Fill in fields to connect to your bot, given the information on the webpage displayed when you started your bot.

Interagieren mit Ihrem Blob Storage-BotInteract with your Blob storage bot

Senden Sie eine Nachricht an den Bot. Der Bot listet daraufhin die von ihm empfangenen Nachrichten auf.Send a message to your bot, and the bot will list the messages it receives.

Testen des Speicherbots im Emulator

Anzeigen Ihrer Blob Storage-DatenView your Blob storage data

Nachdem Sie den Bot ausgeführt und Ihre Informationen gespeichert haben, können Sie sie im Azure-Portal auf der Registerkarte Storage-Explorer anzeigen.After you have run your bot and saved your information, we can view it in under the Storage Explorer tab in the Azure portal.

Blob-TranskriptspeicherBlob transcript storage

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 transcript storage provides a specialized storage option that allows you to easily save and retrieve user conversations in the form of a recorded transcript. Azure-Blob-Transkriptspeicher eignet sich insbesondere für die automatische Erfassung von Benutzereingaben, die dann beim Debuggen zum Untersuchen der Leistung des Bots verwendet werden können.Azure blob transcript storage is particularly useful for automatically capturing user inputs to examine while debugging your bot's performance.

Hinweis

Python unterstützt derzeit keinen Azure Blob-Transkriptspeicher.Python does not currently support Azure Blob transcript storage. JavaScript unterstützt zwar Blobtranskriptspeicher, aber die folgenden Anweisungen gelten nur für C#.While JavaScript supports Blob transcript storage, the following directions are for C# only.

Einrichten eines Blob-TranskriptspeichercontainersSet up a Blob transcript storage container

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.Azure blob transcript storage can use the same blob storage account created following the steps detailed in sections "Create your blob storage account" and "Add configuration information" above. Jetzt fügen Sie einen Container zum Speichern der Transkripte hinzu.We now add a container to hold our transcripts

Erstellen eines Transkriptcontainers

  1. Öffnen Sie Ihr Azure Blob Storage-Konto.Open your Azure blob storage account.
  2. Wählen Sie Storage-Explorer aus.Select Storage Explorer.
  3. Klicken Sie mit der rechten Maustaste auf BLOB-CONTAINER, und wählen Sie BLOB-Container erstellen aus.Right click on BLOB CONTAINERS and select create blob container.
  4. Geben Sie einen Namen für Ihren Transkriptcontainer ein, und wählen Sie dann OK aus.Enter a name for your transcript container and then select OK. (Wir haben mybottranscripts eingegeben)(We entered mybottranscripts)

Implementierung des BlobtranskriptspeichersBlob transcript storage implementation

Der folgende Code verbindet den Zeiger für den Transkriptspeicher _myTranscripts mit Ihrem neuen Azure-Blob-Transkriptspeicherkonto.The following code connects transcript storage pointer _myTranscripts to your new Azure blob transcript storage account. Um diesen Link mit einem neuen Containernamen () zu erstellen, <your-blob-transcript-container-name> erstellt einen neuen Container in Blob Storage, der Ihre Transkriptdateien enthält.To create this link with a new container name, <your-blob-transcript-container-name>, creates a new container within Blob storage to hold your transcript files.

Blob-Transkriptspeicher dient zum Speichern von Bottranskripts.Blob transcript storage is designed to store bot transcripts.

Hinweis

Ab Version 4.10 Microsoft.Bot.Builder.Azure.AzureBlobTranscriptStore ist veraltet.As of version 4.10, Microsoft.Bot.Builder.Azure.AzureBlobTranscriptStore is deprecated. Verwenden Sie die neue Microsoft.Bot.Builder.Azure.Blobs.BlobsTranscriptStore an ihrer Stelle.Use the new Microsoft.Bot.Builder.Azure.Blobs.BlobsTranscriptStore in its place.

echoBot.csechoBot.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-TranskriptsStore user conversations in azure blob transcripts

Sobald ein Blobcontainer zum Speichern von Transkripts verfügbar ist, können Sie beginnen, die Konversationen Ihrer Benutzer mit dem Bot zu speichern.After a blob container is available to store transcripts you can begin to preserve your users' conversations with your bot. Diese Konversationen können später zum Debuggen verwendet werden, um festzustellen, wie Benutzer mit Ihrem Bot interagieren.These conversations can later be used as a debugging tool to see how users interact with your bot. Jede Unterhaltung zum Neustarten des Emulators initiiert die Erstellung einer neuen Aufzeichnungskonversationsliste.Each Emulator Restart conversation initiates the creation of a new transcript conversation list. Der folgende Code speichert Benutzereingaben im Rahmen der Konversation in einer gespeicherten Transkriptdatei.The following code preserves user conversation inputs within a stored transcript file.

  • Das aktuelle Transkript wird mithilfe von LogActivityAsync gespeichert.The current transcript is saved using LogActivityAsync.
  • Gespeicherte Transkripte werden mithilfe von ListTranscriptsAsync abgerufen.Saved transcripts are retrieved using ListTranscriptsAsync. In diesem Beispiel wird die ID jedes gespeicherten Transkripts in einer Liste mit dem Namen „storedTranscripts“ gespeichert.In this sample code the Id of each stored transcript is saved into a list named "storedTranscripts". Mithilfe dieser Liste wird später die Anzahl gespeicherter Blob-Transkripte verwaltet, die beibehalten werden.This list is later used to manage the number of stored blob transcripts we retain.

echoBot.csechoBot.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-TranskripteManage stored blob transcripts

Gespeicherte Transkripte sind zwar hilfreich beim Debuggen, im Laufe der Zeit kann die Anzahl gespeicherter Transkripte jedoch Ihre Speicherkapazität übersteigen.While stored transcripts can be used as a debugging tool, over time the number of stored transcripts can grow larger than you care to preserve. 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.The additional code included below uses DeleteTranscriptAsync to remove all but the last three retrieved transcript items from your blob transcript store.

echoBot.csechoBot.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 Azure Blob Transcript Storage.See Azure Blob Transcript Storage for more information about the class.

Zusätzliche InformationenAdditional Information

Verwalten von Parallelität mit eTagsManage concurrency using eTags

In unserem Botcodebeispiel legen Sie die eTag-Eigenschaft jedes IStoreItem auf * fest.In our bot code example we set the eTag property of each IStoreItem to *. Der eTag-Member (Entitätstag) Ihres Speicherobjekts wird in Cosmos DB zum Verwalten der Parallelität verwendet.The eTag (entity tag) member of your store object is used within Cosmos DB to manage concurrency. 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.The eTag tells your database what to do if another instance of the bot has changed the object in the same storage that your bot is writing to.

Der letzte Schreibzugriff gewinnt: Überschreiben zulassenLast write wins - allow overwrites

Wenn der Eigenschaftenwert von eTag das Sternchen (*) ist, zeigt dies an, dass der letzte Schreibvorgang gewinnt.An eTag property value of asterisk (*) indicates that the last writer wins. 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.When creating a new data store, you can set eTag of a property to * to indicate that you have not previously saved the data that you are writing, or that you want the last writer to overwrite any previously saved property. 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.If concurrency is not an issue for your bot, setting the eTag property to * for any data that you are writing enables overwrites.

Verwalten von Parallelität und Verhindern von ÜberschreibungenMaintain concurrency and prevent overwrites

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.When storing your data into Cosmos DB, use a value other than * for the eTag if you want to prevent concurrent access to a property and avoid overwriting changes from another instance of the bot. 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.The bot receives an error response with the message etag conflict key= when it attempts to save state data and the eTag is not the same value as the eTag in storage.

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.By default, the Cosmos DB store checks the eTag property of a storage object for equality every time a bot writes to that item, and then updates it to a new unique value after each write. 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.If the eTag property on write doesn't match the eTag in storage, it means another bot or thread changed the data.

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.For example, let's say you want your bot to edit a saved note, but you don't want your bot to overwrite changes that another instance of the bot has done. Wenn eine andere Instanz des Bots Bearbeitungen vorgenommen hat, möchten Sie, dass der Benutzer die Version mit den neuesten Aktualisierungen bearbeitet.If another instance of the bot has made edits, you want the user to edit the version with the latest updates.

Erstellen Sie zunächst eine Klasse, die IStoreItem implementiert.First, create a class that implements IStoreItem.

EchoBot.csEchoBot.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.Next, create an initial note by creating a storage object, and add the object to your store.

EchoBot.csEchoBot.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.Then, access and update the note later, keeping its eTag that you read from the store.

EchoBot.csEchoBot.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.If the note was updated in the store before you write your changes, the call to Write will throw an exception.

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.To maintain concurrency, always read a property from storage, then modify the property you read, so that the eTag is maintained. Wenn Sie Benutzerdaten aus dem Speicher lesen, enthält die Antwort die eTag-Eigenschaft.If you read user data from the store, the response will contain the eTag property. 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.If you change the data and write updated data to the store, your request should include the eTag property that specifies the same value as you read earlier. Das Schreiben eines Objekts, dessen eTag auf * festgelegt ist, erlaubt es dem Schreibvorgang jedoch, alle anderen Änderungen zu überschreiben.However, writing an object with its eTag set to * will allow the write to overwrite any other changes.

Nächste SchritteNext steps

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.Now that you know how to read read and write directly from storage, lets take a look at how you can use the state manager to do that for you.