ストレージに直接書き込むWrite directly to storage

注意

このトピックは、最新リリースの SDK (v4) を対象としています。This topic is for the latest release of the SDK (v4). 前のバージョンの SDK (v3) のコンテンツは、こちらにあります。You can find content for the older version of the SDK (v3) here.

ミドルウェアまたはコンテキスト オブジェクトを使用せずに、ストレージ オブジェクトに対して直接読み取りや書き込みを行うことができます。You can read and write directly to your storage object without using middleware or context object. ボットの会話フローの外にあるソースからのデータをボットが使用する場合は、この方法が適切な可能性があります。This can be appropriate to data that your bot uses, that comes from a source outside your bot's conversation flow. たとえば、ユーザーが天気予報を尋ねるボットで、外部データベースからの読み取りによって指定日の天気予報を取得するとします。For example, let's say your bot allows the user to ask for the weather report, and your bot retrieves the weather report for a specified date, by reading it from an external database. 天気データベースの内容はユーザーの情報または会話のコンテキストに依存しないため、状態マネージャーを使用する代わりに、単純にストレージから予報を直接読み取ることができます。The content of the weather database isn't dependent on user information or the conversation context, so you could just read it directly from storage instead of using the state manager. この記事のコード例では、メモリ ストレージCosmos DBBlob Storage、および Azure Blob Transcript Store を使用してストレージに対するデータの読み取りや書き込みを行う方法を示します。The code examples in this article show you how to read and write data to storage using Memory Storage, Cosmos DB, Blob Storage, and Azure Blob Transcript Store.

前提条件Prerequisites

  • Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。If you don't have an Azure subscription, create a free account before you begin.
  • Bot Framework Emulator のインストールInstall the Bot Framework Emulator

メモリ ストレージMemory storage

メモリ ストレージに対するデータの読み取りや書き込みを行うボットを最初に作成します。We will first create a bot that will read and write data to Memory Storage. メモリ ストレージはテストにのみ使用され、実稼働を目的としたものではありません。Memory storage is used for testing purposes only and is not intended for production use. ボットを発行する前に、ストレージを Cosmos DB または Blob Storage に設定してください。Be sure to set storage to Cosmos DB or Blob Storage before publishing your bot.

基本のボットを作成するBuild a basic bot

このトピックの残りの部分では、エコー ボットについては取り上げません。The rest of this topic builds off of a Echo bot. C# または JS でボットを作成できます。You can create one in either C# or JS. Bot Framework Emulator を使用して、ボットへの接続、対話、およびテストが可能です。You can use the Bot Framework Emulator to connect to, converse with, and test your bot. 次のサンプルでは、ユーザーからのすべてのメッセージをリストに追加します。The following sample adds every message from the user to a list. リストを含むデータ構造はストレージに保存されます。The data structure containing the list is saved to your storage.

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

// 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; } = "*";
}

// Every Conversation turn for our Bot calls this method.
public async Task OnTurnAsync(ITurnContext context)
{
     
     var activityType = context.Activity.Type;
     // See if activity type for this turn is a message from the user.
     if (activityType == ActivityTypes.Message)
     {
         var utterance = context.Activity.Text;
         UtteranceLog logItems = null;
          
         // see if there are previous messages saved in sstorage.
         string[] utteranceList = { "UtteranceLog" };
         logItems = _myStorage.ReadAsync<UtteranceLog>(utteranceList).Result?.FirstOrDefault().Value;

         // If no stored messages were found, create and store a new entry.
         if (logItems is null)
         {
             logItems = new UtteranceLog();
         }
         
         // 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 context.SendActivityAsync($"The list is now: {string.Join(", ", logItems.UtteranceList)}");
         
         // Create Dictionary object to hold new list of messages.
         {
             changes.Add("UtteranceLog", logItems);
          };
          
          // Save new list to your Storage.
          await _myStorage.WriteAsync(changes,cancellationToken);
     }
     return;
}

ボットの起動Start your bot

ボットをローカルで実行します。Run your bot locally.

エミュレーターの起動とボットの接続Start the emulator and connect your bot

次に、エミュレーターを起動し、エミュレーターのボットに接続します。Next, start the emulator and then connect to your bot in the emulator:

  1. エミュレーターの [ようこそ] タブにある [Open Bot](ボットを開く) リンクをクリックします。Click the Open Bot link in the emulator "Welcome" tab.
  2. プロジェクトを作成したディレクトリにある .bot ファイルを選択します。Select the .bot file located in the directory where you created the project.

ボットでのやり取りInteract with your bot

メッセージをボットに送信します。ボットは受信したメッセージを表示します。Send a message to your bot, and the bot will list the messages it received. 実行中のエミュレーターEmulator running

Cosmos DB の使用Using Cosmos DB

メモリ ストレージを使用しているので、Azure Cosmos DB を使用するようにコードを更新します。Now that you've used memory storage, we'll update the code to use Azure Cosmos DB. Cosmos DB は、Microsoft のグローバル分散型マルチモデル データベースです。Cosmos DB is Microsoft's globally distributed, multi-model database. Azure Cosmos DB では、Azure のリージョンをいくつでもまたいでスループットとストレージを柔軟かつ個別にスケーリングすることができます。Azure Cosmos DB enables you to elastically and independently scale throughput and storage across any number of Azure's geographic regions. このサービスは包括的なサービス レベル アグリーメント (SLA) により、スループット、待機時間、可用性、一貫性が保証されています。It offers throughput, latency, availability, and consistency guarantees with comprehensive service level agreements (SLAs).

セットアップSet up

ボットで Cosmos DB を使用するには、コードに取り組む前に、いくつかの設定を行う必要があります。To use Cosmos DB in your bot, you'll need to get a few things set up before getting into the code.

データベース アカウントの作成Create your database account

  1. 新しいブラウザー ウィンドウで、Azure Portal にサインインします。In a new browser window, sign in to the Azure portal.
  2. [リソースの作成]、[データベース]、[Azure Cosmos DB] の順にクリックします。Click Create a resource > Databases > Azure Cosmos DB
  3. [新規アカウント] ページ[ID] フィールドに一意の名前を指定します。In the New account page, provide a unique name in the ID field. [API] として [SQL] を選択し、[サブスクリプション][場所]、および [リソース グループ] に情報を指定します。For API, select SQL, and provide Subscription, Location, and Resource group information.
  4. [Create] をクリックします。Then click Create.

アカウントの作成には数分かかります。The account creation takes a few minutes. ポータルに "Wait for the portal to display the Congratulations! Azure Cosmos DB アカウントが作成されました" ページが表示されるまで待機します。Your Azure Cosmos DB account was created page.

コレクションの追加Add a collection
  1. [設定]、[新しいコレクション] の順にクリックします。Click Settings > New Collection. [コレクションの追加] 領域が右端に表示されます。表示するには、右にスクロールする必要がある場合があります。The Add Collection area is displayed on the far right, you may need to scroll right to see it.

Cosmos DB コレクションの追加

  1. 新しいデータベース コレクションは "bot-cosmos-sql-db" です。コレクション ID は "bot-storage" になります。Your new database collection, "bot-cosmos-sql-db" with a collection id of "bot-storage." これらの値は、以降に示すコード例で使用します。We will use these values in our coding example that follows below.

Cosmos DB

  1. データベース設定の [キー] タブで、エンドポイント URI とキーが利用可能になります。The endpoint URI and key are available within the Keys tab of your database settings. これらの値は、この記事の後半のコードの構成で必要になります。These values will be needed to configure your code further down in this article.

Cosmos DB のキー

構成情報の追加Add configuration information

Cosmos DB ストレージを追加するための構成データは短くシンプルなものであり、ボットがより複雑になった場合でも、同じ方法を使用して構成設定を追加できます。Our configuration data to add Cosmos DB storage is short and simple, you can add additional configuration settings using these same methods as your bot gets more complex. この例では、上記の例の Cosmos DB データベースとコレクションの名前を使用します。This example uses the Cosmos DB database and collection names from the example above.

private const string CosmosServiceEndpoint = "<your-cosmos-db-URI>";
private const string CosmosDBKey = "<your-cosmos-db-account-key>";
private const string CosmosDBDatabaseName = "bot-cosmos-sql-db";
private const string CosmosDBCollectionName = "bot-storage";

パッケージのインストールInstalling packages

Cosmos DB に必要なパッケージがあることを確認します。Make sure you have the packages necessary for Cosmos DB

Install-Package Microsoft.Bot.Builder.Azure

実装Implementation

次のサンプル コードは、上記のメモリ ストレージのサンプルと同じボット コードを使用して実行されます。The following sample code runs using the same bot code as the memory storage sample provided above. 次のコード スニペットは、ローカルのメモリ ストレージを置き換える "myStorage" に対する Cosmos DB ストレージの実装を示しています。The code snippet below shows an implementation of Cosmos DB storage for 'myStorage' that replaces local Memory storage.

using Microsoft.Bot.Builder.Azure;

// Create access to Cosmos DB storage.
// Replaces Memory Storage with reference to Cosmos DB.
private static readonly CosmosDbStorage _myStorage = new CosmosDbStorage(new CosmosDbStorageOptions
{
   AuthKey = CosmosDBKey,
   CollectionId = CosmosDBCollectionName,
   CosmosDBEndpoint = new Uri(CosmosServiceEndpoint),
   DatabaseId = CosmosDBDatabaseName,
});

ボットの起動Start your bot

ボットをローカルで実行します。Run your bot locally.

エミュレーターの起動とボットの接続Start the emulator and connect your bot

次に、エミュレーターを起動し、エミュレーターのボットに接続します。Next, start the emulator and then connect to your bot in the emulator:

  1. エミュレーターの [ようこそ] タブにある [Open Bot](ボットを開く) リンクをクリックします。Click the Open Bot link in the emulator "Welcome" tab.
  2. プロジェクトを作成したディレクトリにある .bot ファイルを選択します。Select the .bot file located in the directory where you created the project.

ボットでのやり取りInteract with your bot

メッセージをボットに送信します。ボットは受信したメッセージを表示します。Send a message to your bot, and the bot will list the messages it received. 実行中のエミュレーターEmulator running

データの表示View your data

ボットを実行して情報を保存したら、Azure portal の [データ エクスプローラー] タブの下にその情報を表示できます。After you have run your bot and saved your information, we can view it in the Azure portal under the Data Explorer tab.

データ エクスプローラーの例

eTag を使用してコンカレンシーを管理するManage concurrency using eTags

ボット コード例では、各 IStoreItemeTag プロパティを * に設定します。In our bot code example we set the eTag property of each IStoreItem to *. ストア オブジェクトの eTag (エンティティ タグ) メンバーは、コンカレンシーを管理するために Cosmos DB 内で使用されます。The eTag (entity tag) member of your store object is used within Cosmos DB to manage concurrency. eTag は、自分のボットが書き込んでいる同じストレージ内のオブジェクトをボットの別のインスタンスが変更した場合の対処方法をデータベースに通知します。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.

最後の書き込みが有効 - 上書きを許可するLast write wins - allow overwrites

eTag プロパティの値にアスタリスク (*) を指定すると、最後の書き込みが有効であることを示します。An eTag property value of asterisk (*) indicates that the last writer wins. 新しいデータ ストアを作成するときは、プロパティの eTag* に設定して、以前に保存したことのないデータを書き込んでいること、または以前に保存されたすべてのプロパティを最後の書き込みで上書きすることを示します。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. コンカレンシーがボットにとって問題にならない場合は、書き込んでいるすべてのデータについて eTag プロパティを * に設定して上書きを許可します。If concurrency is not an issue for your bot, setting the eTag property to * for any data that you are writing enables overwrites.

コンカレンシーを維持して上書きを禁止するMaintain concurrency and prevent overwrites

データを Cosmos DB に保存する際に、プロパティへの同時アクセスを禁止し、変更をボットの別のインスタンスによって上書きされないようにする場合は、* 以外の値を eTag に使います。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. ボットが状態データを保存しようとして、eTag がストレージ内の eTag と同じ値でない場合、ボットは etag conflict key= というメッセージのエラー応答を受け取ります。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.

既定では、Cosmos DB ストアはボットがストレージ オブジェクトを書き込むたびにその項目の eTag プロパティが等しいかどうかを確認し、各書き込みの後で新しい一意の値に更新します。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. 書き込みの eTag プロパティがストレージの eTag と一致しない場合は、別のボットまたはスレッドがデータを変更したことを意味します。If the eTag property on write doesn't match the eTag in storage, it means another bot or thread changed the data.

たとえば、保存されたメモをボットで編集しますが、ボットの別のインスタンスが行った変更を上書きしないようにする必要があるものとします。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. ボットの別のインスタンスが編集を行った場合は、ユーザーに最新の更新でバージョンを編集させます。If another instance of the bot has made edits, you want the user to edit the version with the latest updates.

最初に、IStoreItem を実装するクラスを作成します。First, create a class that implements IStoreItem.

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

次に、ストレージ オブジェクトを作成することによって最初のメモを作成し、オブジェクトをストアに追加します。Next, create an initial note by creating a storage object, and add the object to your store.

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

後でメモにアクセスして更新し、ストアから読み取ったその eTag を維持します。Then, access and update the note later, keeping its eTag that you read from the store.

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

変更を書き込む前にストアのメモが更新されていた場合、Write の呼び出しでは例外がスローされます。If the note was updated in the store before you write your changes, the call to Write will throw an exception.

コンカレンシーを維持するには、常にストレージからプロパティを読み取った後、読み取ったプロパティを変更して、eTag が維持されるようにします。To maintain concurrency, always read a property from storage, then modify the property you read, so that the eTag is maintained. ストアからユーザー データを読み取る場合、応答には eTag プロパティが含まれます。If you read user data from the store, the response will contain the eTag property. データを変更して更新後のデータをストアに書き込む場合、要求に含まれる eTag プロパティでは、前に読み取ったのと同じ値が指定されている必要があります。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. ただし、eTag* に設定してオブジェクトを書き込むと、書き込みで他の変更を上書きできます。However, writing an object with its eTag set to * will allow the write to overwrite any other changes.

Blob Storage の使用Using Blob storage

Azure Blob Storage は、Microsoft のクラウド用オブジェクト ストレージ ソリューションです。Azure Blob storage is Microsoft's object storage solution for the cloud. BLOB ストレージは、テキスト データやバイナリ データなどの大量の非構造化データを格納するために最適化されています。Blob storage is optimized for storing massive amounts of unstructured data, such as text or binary data.

Blob Storage アカウントの作成Create your Blob storage account

ボットで Blob Storage を使用するには、コードに取り組む前に、いくつかの設定を行う必要があります。To use Blob storage in your bot, you'll need to get a few things set up before getting into the code.

  1. 新しいブラウザー ウィンドウで、Azure Portal にサインインします。In a new browser window, sign in to the Azure portal.
  2. [リソースの作成]、[Storage]、[ストレージ アカウント - Blob、File、Table、Queue] の順にクリックします。Click Create a resource > Storage > Storage account - blob, file, table, queue
  3. [新規アカウント] ページで、ストレージ アカウントの [名前] を入力し、[アカウントの種類] として [Blob ストレージ] を選択し、[場所][リソース グループ]、および [サブスクリプション] の情報を指定します。In the New account page, enter Name for the storage account, select Blob storage for Account kind, provide Location, Resource group and Subscription infomration.
  4. [Create] をクリックします。Then click Create.

Blob Storage の作成

構成情報の追加Add configuration information

上記のボットの Blob Storage の構成に必要な Blob Storage キーを検索します。Find the Blob Storage keys you need to configure Blob Storage for your bot as shown above:

  1. Azure portal で、Blob Storage アカウントを開き、[設定]、[アクセス キー] の順に選択します。In the Azure portal, open your Blob Storage account and select Settings > Access keys.

Blob Storage キーの検索

ここでは 2 つのキーを使用して、Blob Storage アカウントへのアクセス権をコードに提供します。We will now use two of these keys to provide our code with access to our Blob Storage account.

using Microsoft.Bot.Builder.Azure;

"myStorage" が既存の Blob Storage アカウントを指すようにコード行を更新します。Update the line of code that points "myStorage" to your existing Blob Storage account.



private static readonly AzureBlobStorage _myStorage = new AzureBlobStorage("<your-blob-storage-account-string>", "<your-blob-storage-container-name>");

Blob Storage アカウントを指すように "myStorage" が設定されると、ボット コードは Blob Storage からデータを保存および取得するようになります。Once "myStorage" is set to point to your Blob Storage account, your bot code will now store and retrieve data from Blob Storage.

ボットの起動Start your bot

ボットをローカルで実行します。Run your bot locally.

エミュレーターの起動とボットの接続Start the emulator and connect your bot

次に、エミュレーターを起動し、エミュレーターのボットに接続します。Next, start the emulator and then connect to your bot in the emulator:

  1. エミュレーターの [ようこそ] タブにある [Open Bot](ボットを開く) リンクをクリックします。Click the Open Bot link in the emulator "Welcome" tab.
  2. プロジェクトを作成したディレクトリにある .bot ファイルを選択します。Select the .bot file located in the directory where you created the project.

ボットでのやり取りInteract with your bot

メッセージをボットに送信します。ボットは受信したメッセージを表示します。Send a message to your bot, and the bot will list the messages it received. 実行中のエミュレーターEmulator running

データの表示View your data

ボットを実行して情報を保存したら、Azure portal の [ストレージ エクスプローラー] タブの下にその情報を表示できます。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 トランスクリプト ストレージBlob transcript storage

Azure Blob トランスクリプト ストレージには、特殊なストレージ オプションが用意されています。このオプションを使用すると、記録されたトランスクリプトの形式でユーザーの会話を簡単に保存および取得できます。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 トランスクリプト ストレージは、ボットのパフォーマンスをデバッグする際に、調べるユーザー入力を自動的にキャプチャする場合には特に便利です。Azure blob transcript storage is particularly useful for automatically capturing user inputs to examine when debugging of your bot's performance.

セットアップSet up

Azure Blob トランスクリプト ストレージでは、上記の「Blob Storage アカウントの作成」および「構成情報の追加」の手順に従って作成したのと同じ Blob Storage アカウントを使用できます。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. ここでは、新しい BLOB コンテナーである "mybottranscripts" を追加しました。For this discussion, we have added a new blob container, "mybottranscripts."

実装Implementation

次のコードでは、トランスクリプト ストレージのポインターである "transcriptStore" を新しい Azure BLOB トランスクリプト ストレージ アカウントに接続します。The following code connects transcript storage pointer "transcriptStore" to your new Azure blob transcript storage account. ここに示されているユーザーの会話を格納するソース コードは、会話履歴サンプルに基づいています。The source code to store user conversations shown here is based on the Conversation History sample.

// In Startup.cs
using Microsoft.Bot.Builder.Azure;

// Enable the conversation transcript middleware.
blobStore = new AzureBlobTranscriptStore(blobStorageConfig.ConnectionString, storageContainer);
var transcriptMiddleware = new TranscriptLoggerMiddleware(blobStore);
options.Middleware.Add(transcriptMiddleware);

// In ConversationHistoryBot.cs
using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.Azure;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Schema;

private readonly AzureBlobTranscriptStore _transcriptStore;

/// <param name="transcriptStore">Injected via ASP.NET dependency injection.</param>
public ConversationHistoryBot(AzureBlobTranscriptStore transcriptStore)
{
    _transcriptStore = transcriptStore ?? throw new ArgumentNullException(nameof(transcriptStore));
}

Azure Blob トランスクリプトへのユーザーの会話の保存Store user conversations in azure blob transcripts

BLOB コンテナーでトランスクリプトを保存できるようになったら、ボットとユーザーの会話の保持を開始できます。After a blob container is available to store transcripts you can begin to preserve your users' conversations with your bot. このような会話を後からデバッグ ツールとして使用しすると、ユーザーがボットとどのようにやり取りするかを確認できます。These conversations can later be used as a debugging tool to see how users are interacting with your bot. 次のコードは、activity.text が入力メッセージ !history を受け取ったときにユーザー会話の入力を保持します。The following code preserves user conversation inputs when activity.text receives the input message !history.

/// <summary>
/// Every Conversation turn for our EchoBot will call this method. 
/// </summary>
/// <param name="turnContext">A <see cref="ITurnContext"/> containing all the data needed
/// for processing this conversation turn. </param>        
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
    var activity = turnContext.Activity;
    if (activity.Type == ActivityTypes.Message)
    {
        if (activity.Text == "!history")
        {
           // Download the activities from the Transcript (blob store) when a request to upload history arrives.
           var connectorClient = turnContext.TurnState.Get<ConnectorClient>(typeof(IConnectorClient).FullName);
           // Get all the message type activities from the Transcript.
           string continuationToken = null;
           var count = 0;
           do
           {
               var pagedTranscript = await _transcriptStore.GetTranscriptActivitiesAsync(activity.ChannelId, activity.Conversation.Id);
               var activities = pagedTranscript.Items
                  .Where(a => a.Type == ActivityTypes.Message)
                  .Select(ia => (Activity)ia)
                  .ToList();
               
               var transcript = new Transcript(activities);

               await connectorClient.Conversations.SendConversationHistoryAsync(activity.Conversation.Id, transcript, cancellationToken: cancellationToken);

               continuationToken = pagedTranscript.ContinuationToken;
           }
           while (continuationToken != null);

チャネルに対して保存されているすべてのトランスクリプトの検索Find all stored transcripts for your channel

保存したデータの内容を確認するために、次のコードを使用して、保存したすべてのトランスクリプトの "ConversationID" をプログラムによって検索できます。To see what data you have stored, you can use the following code to programmatically find the "ConversationIDs" for all transcripts that you have stored. ボット エミュレーターを使用してコードをテストする場合に "やり直す" を選択すると、新しいトランスクリプトが新しい "ConversationID" で開始します。When using the bot emulator to test your code, selecting "Start Over" begins a new transcript with a new "ConversationID."

List<string> storedTranscripts = new List<string>();
PagedResult<Transcript> pagedResult = null;
var pageSize = 0;
do
{
    pagedResult = await _transcriptStore.ListTranscriptsAsync("emulator", pagedResult?.ContinuationToken);
    
    // transcript item contains ChannelId, Created, Id.
    // save the converasationIds (Id) found by "ListTranscriptsAsync" to a local list.
    foreach (var item in pagedResult.Items)
    {
         // Make sure we store an unescaped conversationId string.
         var strConversationId = item.Id;
         storedTranscripts.Add(Uri.UnescapeDataString(strConversationId));
    }
} while (pagedResult.ContinuationToken != null);

Azure Blob トランスクリプト ストレージからのユーザーの会話の取得Retrieve user conversations from azure blob transcript storage

ボット対話のトランスクリプトが Azure Blob Transcript Store に保存されたら、それらをプログラムによって取得し、AzureBlobTranscriptStorage メソッドである "GetTranscriptActivities" を使用してテストまたはデバッグできます。Once bot interaction transcripts have been stored into your Azure blob transcript store, you can programmatically retrieve them for testing or debugging using the AzureBlobTranscriptStorage method, "GetTranscriptActivities". 次のコード スニペットでは、保存された各トランスクリプトから過去 24 時間以内に受信して保存されたユーザー入力のトランスクリプトをすべて取得します。The following code snippet retrieves all user inputs transcripts that were received and stored within the previous 24 hours from each stored transcript.

var numTranscripts = storedTranscripts.Count();
for (int i = 0; i < numTranscripts; i++)
{
    PagedResult<IActivity> pagedActivities = null;
    do
    {
        string thisConversationId = storedTranscripts[i];
        // Find all inputs in the last 24 hours.
        DateTime yesterday = DateTime.Now.AddDays(-1);
        // Retrieve iActivities for this transcript.
        pagedActivities = await _myTranscripts.GetTranscriptActivitiesAsync("emulator", thisConversationId, pagedActivities?.ContinuationToken, yesterday);
        foreach (var item in pagedActivities.Items)
        {
            // View as message and find value for key "text" :
            var thisMessage = item.AsMessageActivity();
            var userInput = thisMessage.Text;
         }
    } while (pagedActivities.ContinuationToken != null);
}

保存されたトランスクリプトの Azure Blob トランスクリプト ストレージからの削除Remove stored transcripts from azure blob transcript storage

ユーザー入力データを使用したボットのテストまたはデバッグが完了したら、保存されたトランスクリプトをプログラムによって Azure Blob Transcript Store から削除できます。Once you have finished using user input data to test or debug you bot, stored transcripts can be programmatically removed from your Azure blob transcript store. 次のコード スニペットでは、保存されたトランスクリプトをボットの Transcript Store からすべて削除します。The following code snippet removes all stored transcripts from your bot transcript store.

for (int i = 0; i < numTranscripts; i++)
{
   // Remove all stored transcripts except the last one found.
   if (i > 0)
   {
       string thisConversationId = storedTranscripts[i];    
       await _transcriptStore.DeleteTranscriptAsync("emulator", thisConversationId);
    }
}

次に示すリンク先には、Azure Blob トランスクリプト ストレージに関するその他の情報が記載されています。This following link provides more information concerning Azure Blob Transcript Storage

次の手順Next steps

ストレージを直接読み書きする方法がわかったので、状態マネージャーを使ってそれを行う方法を確認してください。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.