Bagikan melalui


Menulis langsung ke penyimpanan

BERLAKU UNTUK: SDK v4

Anda dapat membaca dan menulis langsung ke objek penyimpanan Anda tanpa menggunakan middleware atau objek konteks. Ini bisa sesuai untuk data yang digunakan bot Anda untuk mempertahankan percakapan, atau data yang berasal dari sumber di luar alur percakapan bot Anda. Dalam model penyimpanan data ini, data dibaca langsung dari penyimpanan alih-alih menggunakan manajer status. Contoh kode dalam artikel ini menunjukkan kepada Anda cara membaca dan menulis data ke penyimpanan menggunakan memori, Cosmos DB, Azure Blob, dan penyimpanan transkrip Azure Blob.

Catatan

Bot Framework JavaScript, C#, dan Python SDK akan terus didukung, namun, Java SDK dihentikan dengan dukungan jangka panjang akhir yang berakhir pada November 2023.

Bot yang ada yang dibangun dengan Java SDK akan terus berfungsi.

Untuk pembuatan bot baru, pertimbangkan untuk menggunakan Power Virtual Agents dan baca tentang memilih solusi chatbot yang tepat.

Untuk informasi selengkapnya, lihat Masa depan pembuatan bot.

Prasyarat

Catatan

Anda dapat menginstal templat dari dalam Visual Studio.

  1. Di menu, pilih Ekstensi lalu Kelola Ekstensi.
  2. Dalam dialog Kelola Ekstensi, cari dan instal templat Bot Framework v4 SDK untuk Visual Studio.

Untuk informasi tentang menyebarkan bot .NET ke Azure, lihat cara Memprovisikan dan menerbitkan bot.

Tentang sampel ini

Kode sampel dalam artikel ini dimulai dengan struktur bot echo dasar, lalu memperluas fungsionalitas bot tersebut dengan menambahkan kode tambahan (disediakan di bawah). Kode yang diperluas ini membuat daftar untuk mempertahankan input pengguna saat diterima. Setiap giliran, daftar lengkap input pengguna, disimpan ke memori, digaungkan kembali ke pengguna. Struktur data yang berisi daftar input ini kemudian dimodifikasi untuk disimpan ke penyimpanan. Berbagai jenis penyimpanan dieksplorasi karena fungsionalitas tambahan ditambahkan ke kode sampel ini.

Penyimpanan memori

Bot Framework SDK memungkinkan Anda menyimpan input pengguna menggunakan penyimpanan dalam memori. Karena penyimpanan dalam memori dibersihkan setiap kali bot dimulai ulang, paling cocok untuk tujuan pengujian dan tidak ditujukan untuk penggunaan produksi. Jenis penyimpanan persisten, seperti penyimpanan database, paling cocok untuk bot produksi.

Membangun bot dasar

Sisa topik ini dibangun dari bot Echo. Kode sampel bot Echo dapat dibuat secara lokal dengan mengikuti instruksi mulai cepat untuk Membuat bot.

Ganti kode di EchoBot.cs dengan kode berikut:

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

Memulai bot Anda

Jalankan bot Anda secara lokal.

Mulai Emulator dan sambungkan bot Anda

Instal Emulator Kerangka Kerja Bot Berikutnya, mulai Emulator lalu sambungkan ke bot Anda di Emulator:

  1. Pilih tautan Buat konfigurasi bot baru di tab Selamat Datang Emulator.
  2. Isi bidang untuk menyambungkan ke bot Anda, mengingat informasi di halaman web yang ditampilkan saat Anda memulai bot Anda.

Berinteraksi dengan bot Anda

Kirim pesan ke bot Anda. Bot akan mencantumkan pesan yang telah diterimanya.

Percakapan dengan bot yang memperlihatkan bot menyimpan daftar pesan dari pengguna.

Sisa artikel ini akan menunjukkan cara menyimpan ke penyimpanan persisten alih-alih memori internal bot.

Menggunakan Cosmos DB

Penting

Kelas penyimpanan Cosmos DB tidak digunakan lagi. Kontainer yang awalnya dibuat dengan CosmosDbStorage tidak memiliki set kunci partisi, dan diberi kunci partisi default _/partitionKey.

Kontainer yang dibuat dengan penyimpanan Cosmos DB dapat digunakan dengan penyimpanan yang dipartisi Cosmos DB. Baca Partisi di Azure Cosmos DB untuk informasi selengkapnya.

Perhatikan juga bahwa, tidak seperti penyimpanan Cosmos DB warisan, penyimpanan yang dipartisi Cosmos DB tidak secara otomatis membuat database dalam akun Cosmos DB Anda. Anda perlu membuat database baru secara manual, tetapi melewati pembuatan kontainer secara manual karena CosmosDbPartitionedStorage akan membuat kontainer untuk Anda.

Sekarang setelah Anda menggunakan penyimpanan memori, kami akan memperbarui kode untuk menggunakan Azure Cosmos DB. Cosmos DB adalah database multi-model Microsoft yang didistribusikan secara global. Azure Cosmos DB memungkinkan Anda menskalakan throughput dan penyimpanan secara elastis dan independen di sejumlah wilayah geografis Azure. Database ini menawarkan jaminan produk, latensi, ketersediaan, dan konsistensi dengan perjanjian tingkat layanan (SLA) yang komprehensif.

Menyiapkan sumber daya Cosmos DB

Untuk menggunakan Cosmos DB di bot, Anda harus membuat sumber daya database sebelum masuk ke kode. Untuk deskripsi mendalam tentang database Cosmos DB dan pembuatan aplikasi, lihat mulai cepat untuk .NET, Node.js, atau Python.

Membuat akun database Anda

  1. Buka portal Microsoft Azure untuk membuat akun Azure Cosmos DB. Cari dan pilih Azure Cosmos DB.

  2. Di halaman Azure Cosmos DB , pilih Baru untuk memunculkan halaman Buat Akun Azure Cosmos DB.

    Cuplikan layar pembuatan akun Cosmos DB Anda.

  3. Masukkan nilai untuk bidang berikut:

    1. Langganan. Pilih langganan Azure yang ingin Anda gunakan untuk akun Azure Cosmos ini.
    2. Grup Sumber Daya. Pilih grup sumber daya yang sudah ada atau pilih Buat baru, dan masukkan nama untuk grup sumber daya baru.
    3. Nama akun. Masukkan nama untuk mengidentifikasi akun Azure Cosmos Anda. Karena documents.azure.com ditambahkan ke nama yang Anda berikan untuk membuat URI Anda, gunakan nama yang unik. Perhatikan panduan berikut:
      • Nama yang Anda pilih harus unik di seluruh Azure.
      • Panjang nama harus antara 3 dan 31 karakter.
      • Nama hanya dapat menyertakan huruf kecil, angka, dan karakter tanda hubung (-).
    4. API. Pilih Core(SQL)
    5. Lokasi. pilih lokasi yang paling dekat dengan pengguna Anda untuk memberi mereka akses tercepat ke data.
  4. Pilih Tinjau + Buat.

  5. Setelah divalidasi, pilih Buat.

Pembuatan akun memakan waktu beberapa menit. Tunggu hingga portal menampilkan halaman Selamat! Akun Azure Cosmos DB Anda telah dibuat.

Tambahkan database

Catatan

Jangan membuat kontainer sendiri. Bot Anda akan membuatnya untuk Anda saat membuat klien Cosmos DB internalnya, memastikannya dikonfigurasi dengan benar untuk menyimpan status bot.

  1. Navigasi ke halaman Data Explorer dalam akun Cosmos DB yang baru dibuat, lalu pilih Database Baru dari menu drop-down Kontainer Baru. Panel kemudian akan terbuka di sisi kanan jendela, di mana Anda dapat memasukkan detail untuk database baru.

    Cuplikan layar pembuatan database Cosmos DB Anda.

  2. Masukkan ID untuk database baru Anda dan, secara opsional, atur throughput (Anda dapat mengubahnya nanti) dan akhirnya pilih OK untuk membuat database Anda. Catat ID database ini untuk digunakan nanti saat mengonfigurasi bot Anda.

  3. Sekarang setelah Anda membuat akun Cosmos DB dan database, Anda perlu menyalin beberapa nilai untuk mengintegrasikan database baru Anda ke dalam bot Anda. Untuk mengambilnya, navigasikan ke tab Kunci di dalam bagian pengaturan database akun Cosmos DB Anda. Dari halaman ini, Anda memerlukan URI (titik akhir Cosmos DB) dan KUNCI PRIMER (kunci otorisasi).

Anda sekarang harus memiliki akun Cosmos DB dengan database dan nilai berikut yang siap digunakan dalam pengaturan bot Anda.

  • URI
  • Kunci Primer
  • ID Database

Menambahkan informasi konfigurasi Cosmos DB

Gunakan detail yang Anda catat di bagian sebelumnya dari artikel ini untuk mengatur titik akhir, kunci otorisasi, dan ID database Anda. Terakhir, Anda harus memilih nama yang sesuai untuk kontainer yang akan dibuat dalam database Anda untuk menyimpan status bot Anda. Dalam contoh di bawah kontainer Cosmos DB yang dibuat akan diberi nama "bot-storage".

Tambahkan informasi berikut ke file konfigurasi Anda.

appsettings.json

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

Menginstal paket Cosmos DB

Pastikan Anda memiliki paket yang diperlukan untuk Cosmos DB.

Instal paket Microsoft.Bot.Builder.Azure NuGet. Untuk informasi selengkapnya tentang menggunakan NuGet, lihat Menginstal dan mengelola paket di Visual Studio menggunakan NuGet Package Manager .

Implementasi Cosmos DB

Catatan

Versi 4.6 memperkenalkan penyedia penyimpanan Cosmos DB baru, kelas penyimpanan yang dipartisi Cosmos DB, dan kelas penyimpanan Cosmos DB asli tidak digunakan lagi. Kontainer yang dibuat dengan penyimpanan Cosmos DB dapat digunakan dengan penyimpanan yang dipartisi Cosmos DB. Baca Partisi di Azure Cosmos DB untuk informasi selengkapnya.

Tidak seperti penyimpanan Cosmos DB warisan, penyimpanan yang dipartisi Cosmos DB tidak secara otomatis membuat database dalam akun Cosmos DB Anda. Anda perlu membuat database baru secara manual, tetapi melewati pembuatan kontainer secara manual karena CosmosDbPartitionedStorage akan membuat kontainer untuk Anda.

Kode sampel berikut berjalan menggunakan kode bot yang sama dengan sampel penyimpanan memori yang disediakan di atas, dengan pengecualian yang tercantum di sini. Cuplikan kode di bawah ini menunjukkan implementasi penyimpanan Cosmos DB untuk 'myStorage' yang menggantikan penyimpanan Memori lokal.

Pertama-tama Anda perlu memperbarui Startup.cs untuk mereferensikan pustaka Azure pembuat bot:

using Microsoft.Bot.Builder.Azure;

Selanjutnya, dalam ConfigureServices metode di Startup.cs, buat CosmosDbPartitionedStorage objek . Ini akan diteruskan ke EchoBot konstruktor melalui injeksi dependensi.

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

Dalam EchoBot.cs ubah _myStorage deklarasi private static readonly MemoryStorage _myStorage = new MemoryStorage(); variabel menjadi yang berikut:

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

Kemudian teruskan IStorage objek ke EchoBot konstruktor:

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

Mulai bot Cosmos DB Anda

Jalankan bot Anda secara lokal.

Uji bot Cosmos DB Anda dengan Bot Framework Emulator

Sekarang mulai Emulator Kerangka Kerja Bot dan sambungkan ke bot Anda:

  1. Pilih tautan buat konfigurasi bot baru di tab Selamat Datang Emulator.
  2. Isi bidang untuk menyambungkan ke bot Anda, mengingat informasi di halaman web yang ditampilkan saat Anda memulai bot Anda.

Berinteraksi dengan bot Cosmos DB Anda

Kirim pesan ke bot Anda, dan bot akan mencantumkan pesan yang diterimanya.

Percakapan dengan bot yang memperlihatkan bot menyimpan daftar pesan dari pengguna.

Menampilkan data Cosmos DB Anda

Setelah menjalankan bot dan menyimpan informasi, Anda bisa melihat data yang disimpan di portal Azure di bawah tab Data Explorer.

Cuplikan layar Data Explorer di portal Azure.

Menggunakan penyimpanan Blob

Penyimpanan Azure Blob adalah solusi penyimpanan objek Microsoft untuk cloud. Penyimpanan Blob dioptimalkan untuk menyimpan sejumlah besar data yang tidak terstruktur, seperti teks atau data biner. Bagian ini menjelaskan cara membuat akun penyimpanan dan kontainer blob Azure, lalu cara mereferensikan kontainer penyimpanan blob Anda dari bot Anda.

Untuk informasi selengkapnya tentang Blob Storage, lihat Apa itu penyimpanan Azure Blob?

Membuat akun penyimpanan Blob Anda

Untuk menggunakan penyimpanan Blob di bot, Anda harus menyiapkan beberapa hal sebelum masuk ke kode.

  1. Di portal Azure, pilih Semua layanan.

  2. Di bagian Unggulan dari halaman Semua layanan , pilih Akun penyimpanan.

  3. Di halaman Akun penyimpanan , pilih Baru.

    Cuplikan layar pembuatan akun Azure Storage.

  4. Di bidang Langganan, pilih langganan untuk membuat akun penyimpanan.

  5. Di bidang Grup sumber daya, pilih grup sumber daya yang sudah ada atau pilih Buat baru, dan masukkan nama untuk grup sumber daya baru.

  6. Di bidang Nama akun penyimpanan, masukkan nama untuk akun tersebut. Ingat panduan berikut:

    • Nama yang Anda pilih harus unik di seluruh Azure.
    • Panjang nama harus antara 3 dan 24 karakter.
    • Nama hanya dapat berisi angka dan huruf kecil.
  7. Di bidang Lokasi, pilih lokasi untuk akun penyimpanan, atau gunakan lokasi default.

  8. Untuk pengaturan lainnya, konfigurasikan yang berikut ini:

  9. Di bagian Detail proyek dari halaman Buat akun penyimpanan, pilih nilai yang diinginkan untuk langganan dan Grup sumber daya.

  10. Di bagian Detail instans dari halaman Buat akun penyimpanan, masukkan nama akun Penyimpanan lalu pilih nilai untuk Lokasi, Jenis akun, dan Replikasi.

  11. Pilih Tinjau + buat untuk meninjau pengaturan akun penyimpanan.

  12. Setelah divalidasi, pilih Buat.

Membuat kontainer penyimpanan Blob

Setelah akun penyimpanan Blob Anda dibuat, buka, lalu:

  1. Pilih Penjelajah Penyimpanan (Pratinjau).

  2. Kemudian klik kanan pada KONTAINER BLOB

  3. Pilih Buat kontainer blob dari daftar drop-down.

    Cuplikan layar pembuatan kontainer blob.

  4. Masukkan nama dalam formulir Kontainer baru. Anda akan menggunakan nama ini untuk nilai "nama kontainer blob" Anda untuk menyediakan akses ke akun penyimpanan Blob Anda. Ingat panduan berikut:

    • Nama ini hanya boleh berisi huruf kecil, angka, dan tanda hubung.
    • Nama ini harus dimulai dengan huruf atau angka.
    • Setiap tanda hubung harus didahului dan diikuti oleh karakter non-tanda hubung yang valid.
    • Panjang nama harus antara 3 dan 63 karakter.

Menambahkan informasi konfigurasi penyimpanan Blob

Temukan kunci penyimpanan Blob yang Anda butuhkan untuk mengonfigurasi penyimpanan Blob untuk bot Anda seperti yang ditunjukkan di atas:

  1. Di portal Azure, buka akun penyimpanan Blob Anda dan pilih Kunci akses di bagian Pengaturan.
  2. Untuk mengonfigurasi bot Anda untuk mengakses akun penyimpanan Blob Anda, gunakan string Koneksi ion sebagai nilai untuk blob string koneksi.

Tambahkan informasi berikut ke file konfigurasi Anda.

appsettings.json

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

Menginstal paket penyimpanan Blob

Jika sebelumnya tidak diinstal, instal paket berikut.

Instal paket NuGet Microsoft.Bot.Builder.Azure.Blobs. Untuk informasi selengkapnya tentang menggunakan NuGet, lihat Menginstal dan mengelola paket di Visual Studio menggunakan NuGet Package Manager.

Implementasi penyimpanan blob

Penyimpanan blob digunakan untuk menyimpan status bot.

Catatan

Pada versi 4.10, Microsoft.Bot.Builder.Azure.AzureBlobStorage tidak digunakan lagi. Gunakan yang baru Microsoft.Bot.Builder.Azure.Blobs.BlobsStorage di tempatnya.

Kode sampel berikut berjalan menggunakan kode bot yang sama dengan sampel penyimpanan memori yang disediakan di atas, dengan pengecualian yang tercantum di sini.

Cuplikan kode di bawah ini menunjukkan implementasi penyimpanan Blob untuk 'myStorage' yang menggantikan penyimpanan Memori lokal.

Pertama-tama Anda perlu memperbarui Startup.cs untuk mereferensikan pustaka blob Azure pembuat bot:

Startup.cs

using Microsoft.Bot.Builder.Azure.Blobs;

Selanjutnya, dalam ConfigureServices metode di Startup.cs, buat BlobsStorage objek , meneruskan nilai dari appsettings.json. Ini akan diteruskan ke EchoBot konstruktor melalui injeksi dependensi.

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

Sekarang Anda harus memperbarui EchoBot.cs terlebih dahulu untuk mereferensikan pustaka blob Azure pembuat bot:

EchoBot.cs

using Microsoft.Bot.Builder.Azure.Blobs;

Selanjutnya, hapus atau komentari baris kode yang membuat variabel MemoryStorage 'private static readonly MemoryStorage _myStorage = new MemoryStorage();', dan buat variabel baru yang akan digunakan untuk menyimpan input pengguna ke Blob Storage.

EchoBot.cs

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

Kemudian teruskan IStorage objek ke EchoBot konstruktor:

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

Setelah penyimpanan Anda diatur untuk menunjuk ke akun Blob Storage Anda, kode bot Anda sekarang akan menyimpan dan mengambil data dari penyimpanan Blob.

Setelah penyimpanan Anda diatur untuk menunjuk ke akun Blob Storage Anda, kode bot Anda sekarang akan menyimpan dan mengambil data dari penyimpanan Blob.

Memulai bot penyimpanan Blob Anda

Jalankan bot Anda secara lokal.

Mulai Emulator dan sambungkan bot penyimpanan Blob Anda

Selanjutnya, mulai Emulator lalu sambungkan ke bot Anda di Emulator:

  1. Pilih tautan Buat konfigurasi bot baru di tab Emulator "Selamat Datang".
  2. Isi bidang untuk menyambungkan ke bot Anda, mengingat informasi di halaman web yang ditampilkan saat Anda memulai bot Anda.

Berinteraksi dengan bot penyimpanan Blob Anda

Kirim pesan ke bot Anda, dan bot akan mencantumkan pesan yang diterimanya.

Percakapan dengan bot yang memperlihatkan bot menyimpan daftar pesan dari pengguna.

Menampilkan data penyimpanan Blob Anda

Setelah Anda menjalankan bot dan menyimpan informasi Anda, kami dapat melihatnya di bawah tab Penjelajah Penyimpanan di portal Azure.

Penyimpanan transkrip blob

Penyimpanan transkrip blob Azure menyediakan opsi penyimpanan khusus yang memungkinkan Anda dengan mudah menyimpan dan mengambil percakapan pengguna dalam bentuk transkrip yang direkam. Penyimpanan transkrip blob Azure berguna untuk menangkap input pengguna secara otomatis untuk diperiksa saat menelusuri kesalahan performa bot Anda.

Catatan

Python saat ini tidak mendukung penyimpanan transkrip Azure Blob. Meskipun JavaScript mendukung penyimpanan transkrip Blob, petunjuk berikut hanya untuk C#.

Menyiapkan kontainer penyimpanan transkrip Blob

Penyimpanan transkrip blob Azure dapat menggunakan akun penyimpanan blob yang sama yang dibuat dengan mengikuti langkah-langkah yang dirinci di bagian "Buat akun penyimpanan blob Anda" dan "Tambahkan informasi konfigurasi" di atas. Kami sekarang menambahkan kontainer untuk menyimpan transkrip kami

Cuplikan layar pembuatan kontainer blob untuk digunakan sebagai penyimpanan transkrip.

  1. Buka akun penyimpanan blob Azure Anda.
  2. Pilih Penjelajah Penyimpanan.
  3. Klik kanan pada KONTAINER BLOB dan pilih buat kontainer blob.
  4. Masukkan nama untuk kontainer transkrip Anda lalu pilih OK. (Kami memasuki mybottranscripts)

Implementasi penyimpanan transkrip blob

Kode berikut menyambungkan penunjuk _myTranscripts penyimpanan transkrip ke akun penyimpanan transkrip blob Azure baru Anda. Untuk membuat tautan ini dengan nama kontainer baru, <your-blob-transcript-container-name>, tautan ini membuat kontainer baru dalam penyimpanan Blob untuk menyimpan file transkrip Anda.

Penyimpanan transkrip blob dirancang untuk menyimpan transkrip bot.

Catatan

Pada versi 4.10, Microsoft.Bot.Builder.Azure.AzureBlobTranscriptStore tidak digunakan lagi. Gunakan yang baru Microsoft.Bot.Builder.Azure.Blobs.BlobsTranscriptStore di tempatnya.

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

   ...
}

Menyimpan percakapan pengguna di transkrip blob Azure

Setelah kontainer blob tersedia untuk menyimpan transkrip, Anda dapat mulai mempertahankan percakapan pengguna dengan bot Anda. Percakapan ini nantinya dapat digunakan sebagai alat penelusuran kesalahan untuk melihat bagaimana pengguna berinteraksi dengan bot Anda. Setiap percakapan Restart Emulator memulai pembuatan daftar percakapan transkrip baru. Kode berikut mempertahankan input percakapan pengguna dalam file transkrip tersimpan.

  • Transkrip saat ini disimpan menggunakan LogActivityAsync.
  • Transkrip yang disimpan diambil menggunakan ListTranscriptsAsync. Dalam kode sampel ini, ID setiap transkrip yang disimpan disimpan ke dalam daftar bernama "storedTranscripts". Daftar ini kemudian digunakan untuk mengelola jumlah transkrip blob tersimpan yang kami pertahankan.

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

    ...
}

Mengelola transkrip blob tersimpan

Meskipun transkrip yang disimpan dapat digunakan sebagai alat penelusuran kesalahan, seiring waktu jumlah transkrip yang disimpan dapat tumbuh lebih besar dari yang Anda pedulikan untuk dipertahankan. Kode tambahan yang disertakan di bawah ini menggunakan DeleteTranscriptAsync untuk menghapus semua tetapi tiga item transkrip terakhir yang diambil dari penyimpanan transkrip blob Anda.

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

Untuk informasi selengkapnya tentang kelas, lihat Azure Blob Transcript Storage.

Informasi Tambahan

Mengelola konkurensi menggunakan eTags

Dalam contoh kode bot kami, kami mengatur eTag properti masing-masing IStoreItem ke *. Anggota eTag (tag entitas) objek penyimpanan Anda digunakan dalam Cosmos DB untuk mengelola konkurensi. memberi eTag tahu database Anda apa yang harus dilakukan jika instans bot lain telah mengubah objek dalam penyimpanan yang sama dengan yang ditulis bot Anda.

Kemenangan tulis terakhir - izinkan penimpaan

eTag Nilai properti tanda bintang (*) menunjukkan bahwa penulis terakhir menang. Saat membuat penyimpanan data baru, Anda dapat mengatur eTag properti untuk * menunjukkan bahwa Anda sebelumnya belum menyimpan data yang Sedang Anda tulis, atau anda ingin penulis terakhir menimpa properti yang disimpan sebelumnya. Jika konkurensi bukan masalah untuk bot Anda, mengatur eTag properti ke * untuk data apa pun yang Anda tulis memungkinkan penimpaan.

Pertahankan konkurensi dan cegah penimpaan

Saat menyimpan data Anda ke Cosmos DB, gunakan nilai selain * untuk eTag jika Anda ingin mencegah akses bersamaan ke properti dan menghindari penimpaan perubahan dari instans bot lain. Bot menerima respons kesalahan dengan pesan etag conflict key= saat mencoba menyimpan data status dan eTag nilainya tidak sama eTag dengan di penyimpanan.

Secara default, penyimpanan Cosmos DB memeriksa eTag properti objek penyimpanan untuk kesetaraan setiap kali bot menulis ke item tersebut, lalu memperbaruinya ke nilai unik baru setelah setiap penulisan. eTag Jika properti pada tulis tidak cocok dengan eTag di penyimpanan, itu berarti bot atau utas lain mengubah data.

Misalnya, Anda ingin bot Mengedit catatan tersimpan, tetapi Anda tidak ingin bot Anda menimpa perubahan yang telah dilakukan oleh instans bot lain. Jika instans bot lain telah melakukan pengeditan, Anda ingin pengguna mengedit versi dengan pembaruan terbaru.

Pertama, buat kelas yang mengimplementasikan IStoreItem.

EchoBot.cs

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

Selanjutnya, buat catatan awal dengan membuat objek penyimpanan, dan tambahkan objek ke penyimpanan Anda.

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

Kemudian, akses dan perbarui catatan nanti, simpan eTag catatan yang Anda baca dari toko.

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

Jika catatan diperbarui di penyimpanan sebelum Anda menulis perubahan, panggilan ke Write akan melemparkan pengecualian.

Untuk menjaga konkurensi, selalu baca properti dari penyimpanan, lalu ubah properti yang Anda baca, sehingga eTag dipertahankan. Jika Anda membaca data pengguna dari penyimpanan, respons akan berisi properti eTag. Jika Anda mengubah data dan menulis data yang diperbarui ke penyimpanan, permintaan Anda harus menyertakan properti eTag yang menentukan nilai yang sama seperti yang Anda baca sebelumnya. Namun, menulis objek dengan set-nya eTag * akan memungkinkan penulisan menimpa perubahan lain.

Langkah berikutnya

Sekarang setelah Anda tahu cara membaca dan menulis langsung dari penyimpanan, mari kita lihat bagaimana Anda dapat menggunakan manajer status untuk melakukannya untuk Anda.