Richtlinien für das DebuggenDebugging guidelines

gilt für: SDK v4APPLIES TO: SDK v4

Bots sind komplexe Apps, bei denen viele verschiedene Komponenten zusammenarbeiten.Bots are complex apps, with a lot of different parts working together. Wie bei jeder komplexen App kann dies zu einigen interessanten Fehlern führen oder bei Ihrem Bot ein anderes Verhalten als das erwartete verursachen.Like any other complex app, this can lead to some interesting bugs or cause your bot to behave differently than expected.

Das Debuggen Ihres Bots kann eine schwierige Aufgabe sein.Debugging, your bot can sometimes be a difficult task. Jeder Entwickler hat eine eigene bevorzugte Methode für diese Aufgabe, und die unten angegebenen Richtlinien sind Vorschläge zu Ihrer Verwendung, die für die überwiegende Mehrheit aller Bots gelten.Every developer has their own preferred way to accomplish that task; guidelines we present below are suggestions for you to use that apply to a large majority of bots.

Nachdem Sie sich vergewissert haben, dass Ihr Bot wunschgemäß funktioniert, besteht der nächste Schritt darin, ihn mit einem Kanal zu verbinden.After verifying your bot appears to work how you'd like it to, the next step is connecting it to a channel. Dazu können Sie Ihren Bot auf einem Stagingserver bereitstellen und einen eigenen Direct Line-Client für die Verbindung mit Ihrem Bot erstellen.To do this, you can deploy your bot to a staging server and create your own direct line client for your bot to connect to.

Durch das Erstellen eines eigenen Clients können Sie die interne Funktionsweise des Kanals definieren und spezifisch testen, wie Ihr Bot auf den Austausch bestimmter Aktivitäten reagiert.Creating your own client allows you to define the inner workings of the channel, as well as specifically test how your bot responds to certain activity exchanges. Sobald die Verbindung mit Ihrem Client besteht, führen Sie die Tests aus, um den Botzustand einzurichten und Ihre Features zu überprüfen.Once connected to your client, run your tests to set up your bot state and verify your features. Wenn Ihr Bot ein Feature wie Spracherkennung nutzt, können Sie diese Funktionalität mithilfe dieser Kanäle überprüfen.If your bot utilizes a feature like speech, using these channels can offer a way to verify that functionality.

Wenn Sie hier den Emulator und Webchat über das Azure-Portal verwenden, können Sie weiter Einblicke in die Leistung Ihres Bots bei der Interaktion mit verschiedenen Kanälen erhalten.Use of both the Emulator and Web Chat via Azure portal here can provide further insight into how your bot performs while interacting with different channels.

Das Debuggen des Bots funktioniert ähnlich wie bei anderen Apps mit mehreren Threads: Sie können Haltepunkte festlegen oder Features wie das Direktfenster verwenden.Debugging your bot works similarly to other multi-threaded apps, with the ability to set breakpoints or use features like the immediate window.

Bots folgen einem ereignisgesteuerten Programmierparadigma, das möglicherweise schwierig zu rationalisieren ist, wenn Sie nicht mit ihm vertraut sind.Bots follow an event driven programming paradigm, which can be hard to rationalize if you're not familiar with it. Die Idee, dass der Bot zustandslos ist, mehrere Threads aufweist und asynchrone oder Warte-Aufrufe behandeln muss, kann zu unerwarteten Fehlern führen.The idea of your bot being stateless, multi-threaded, and dealing with async/await calls can result in unexpected bugs. Auch wenn das Debuggen Ihres Bots ähnlich wie bei anderen Apps mit mehreren Threads funktioniert, finden Sie hier einige Vorschläge, Tools und Ressourcen zur Hilfestellung.While debugging your bot works similarly to other multi-threaded apps, we'll cover some suggestions, tools, and resources to help.

Grundlegendes zu Botaktivitäten mit dem EmulatorUnderstanding bot activities with the Emulator

Der Bot behandelt unterschiedliche Typen von Aktivitäten neben der normalen Nachrichtenaktivität.Your bot deals with different types of activities besides the normal message activity. Die Verwendung des Emulators zeigt Ihnen, was diese Aktivitäten sind, wann sie auftreten und welche Informationen sie enthalten.Using the Emulator will show you what those activities are, when they happen, and what information they contain. Ein Verständnis dieser Aktivitäten hilft Ihnen dabei, Ihren Bot effizienter zu schreiben, und ermöglicht Ihnen, zu überprüfen, ob die gesendeten und empfangenen Aktivitäten des Bots Ihren Erwartungen entsprechen.Understanding those activities will help you code your bot efficiently and allows you to verify the activities your bot is sending and receiving are what you expect.

Speichern und Abrufen von Benutzerinteraktionen mit TranskriptsSaving and retrieving user interactions with transcripts

Über Azure-Blob-Transkriptspeicher wird eine spezielle Ressource bereitgestellt, mit der Sie Transkripts, die Interaktionen zwischen Ihren Benutzern und Ihrem Bot enthalten, speichern und abrufen können.Azure blob transcript storage provides a specialized resource where you can both store and retrieve transcripts containing interactions between your users and your bot.

Außerdem können Sie nach dem Speichern der Benutzereingabeinteraktionen den „Speicher-Explorer“ von Azure verwenden, um Daten, die in den Transkripts im Blob-Transkriptspeicher enthalten sind, manuell anzuzeigen.Additionally, once user input interactions have been stored, you can use Azure's "storage explorer" to manually view data contained in transcripts stored within your blob transcript store. Im folgenden Beispiel wird der „Speicher-Explorer“ über die Einstellungen für „mynewtestblobstorage“ geöffnet.The following example opens "storage explorer" from settings for "mynewtestblobstorage." Wählen Sie Folgendes, um eine gespeicherte Benutzereingabe zu öffnen: Blobcontainer > ChannelId > TranscriptId > ConversationId.To open a saved user input select: Blob Container > ChannelId > TranscriptId > ConversationId

Examine_stored_transcript_text

Die gespeicherte Benutzereingabe der Konversation wird im JSON-Format geöffnet.This opens the stored user conversation input in JSON format. Die Benutzereingabe wird zusammen mit dem Schlüssel „text: “ aufbewahrt.User input is preserved together with the key "text:."

Funktionsweise von MiddlewareHow middleware works

Middleware ist bei der ersten Verwendung möglicherweise nicht intuitiv, insbesondere beim Fortsetzen oder Kurzschließen der Ausführung.Middleware may not be intuitive when first attempting to use it, particularly regarding the continuation, or short-circuiting, of execution. Middleware kann zu Beginn oder zum Ende eines Durchlaufs ausgeführt werden. Dabei legt der Aufruf des Delegats next() fest, wann die Ausführung an die Logik des Bots übergeben wird.Middleware can execute on the leading or trailing edge of a turn, with a call to the next() delegate dictating when execution is passed to the bot logic.

Wenn Sie mehrere Middlewareelemente verwenden, kann der Delegat die Ausführung an eine andere Middleware übergeben, wenn Ihre Pipeline entsprechend ausgerichtet ist.If you are using multiple pieces of middleware the delegate may pass execution to a different piece of middleware if that is how your pipeline is oriented. Details zur Middleware-Pipeline des Bots können dazu beitragen, diese Idee zu verdeutlichen.Details on the bot middleware pipeline can help make that idea clearer.

Das Nichtaufrufen des Delegats next() wird als Kurzschlussweiterleitung bezeichnet.If the next() delegate is not called, that's referred to as short circuit routing. Dies geschieht, wenn die Middleware die aktuelle Aktivität erfüllt und festlegt, dass es nicht erforderlich ist, die Ausführung zu übergeben.This happens when the middleware satisfies the current activity and determines it's not necessary to pass execution on.

Das Verständnis, wann und warum Middleware einen Kurzschluss ausführt, kann einen Hinweis darauf bieten, welche Middleware in Ihrer Pipeline zuerst eingesetzt werden soll.Understanding when, and why, middleware short-circuits helps indicate which piece of middleware should come first in your pipeline. Außerdem ist eine klare Erwartung besonders wichtig für integrierte Middleware, die durch das SDK oder andere Entwickler bereitgestellt wird.Additionally, understanding what to expect is particularly important for built-in middleware provided by the SDK or other developers. Es kann hilfreich sein, zuerst eigene Middleware zu erstellen, um vor dem Einstieg in die integrierte Middleware ein wenig zu experimentieren.Some find it helpful to try creating your own middleware first to experiment a bit before diving into the built-in middleware.

Grundlegendes zum ZustandUnderstanding state

Die Überwachung des Zustands ist ein wichtiger Bestandteil Ihres Bots, insbesondere für komplexe Aufgaben.Keeping track of state is an important part of your bot, particularly for complex tasks. Im Allgemeinen hat es sich bewährt, Aktivitäten möglichst schnell zu verarbeiten und die Verarbeitung abzuschließen, sodass der Zustand beibehalten wird.In general, best practice is to process activities as quickly as possible and let the processing complete so that state gets persisted. Aktivitäten können aufgrund der asynchronen Architektur zur nahezu selben Zeit an Ihren Bot gesendet werden, und dies kann zu sehr verwirrenden Fehlern führen.Activities can be sent to your bot at nearly the same time, and that can introduce very confusing bugs because of the asynchronous architecture.

Stellen Sie vor allem sicher, dass der Status ihren Erwartungen entsprechend beibehalten wird.Most importantly, make sure that state is persisting in a way that matches your expectations. Abhängig davon, wo sich Ihr persistenter Zustand befindet, können Sie ihn mithilfe von Speicheremulatoren für Cosmos DB und Azure Table Storage überprüfen, bevor Sie Produktionsspeicher verwenden.Depending on where your persisted state lives, storage emulators for Cosmos DB and Azure Table storage can help you verify that state before using production storage.

Wichtig

Die Klasse Cosmos DB-Speicher wurde als veraltet gekennzeichnet.The Cosmos DB storage class has been deprecated. Container, die ursprünglich mit CosmosDbStorage erstellt wurden, hatten keinen Partitionsschlüsselsatz und wurden mit dem Standardpartitionsschlüssel _ / partitionKey versehen.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.

Verwenden von AktivitätshandlernHow to use activity handlers

Aktivitätshandler können eine weitere Ebene der Komplexität einführen, in erster Linie dadurch, dass jede Aktivität in einem unabhängigen Thread (oder abhängig von Ihrer Sprache in Webworkern) ausgeführt wird.Activity handlers can introduce another layer of complexity, particularly since each activity runs on an independent thread (or web workers, depending on your language). Je nach den Aktionen Ihrer Handler kann dies Probleme verursachen, bei denen der aktuelle Zustand nicht Ihren Erwartungen entspricht.Depending on what your handlers are doing, this can cause issues where the current state is not what you expect.

Der integrierte Zustand wird am Ende eines Durchlaufs geschrieben, während dieses Durchlaufs generierte Aktivitäten werden jedoch unabhängig von der Durchlaufpipeline ausgeführt.Built-in state gets written at the end of a turn, however any activities generated by that turn are executing independently of the turn pipeline. Häufig hat dies keine Auswirkung, aber wenn ein Aktivitätshandler den Zustand ändert, muss der Zustand geschrieben werden, damit er diese Änderung enthält.Often this doesn't impact us, but if an activity handler changes state we need the state written to contain that change. In diesem Fall kann die Durchlaufpipeline vor dem Abschluss warten, bis die Aktivität abgeschlossen ist, um sicherzustellen, dass für diesen Durchlauf der richtige Zustand aufgezeichnet wird.In that case, the turn pipeline can wait on the activity to finish processing before completing to make sure it records the correct state for that turn.

Die Methode send activity und ihre Handler stellen ein besonderes Problem dar.The send activity method, and its handlers, pose a unique problem. Der einfache Aufruf von send activity innerhalb des Handlers on send activities bewirkt eine unendliche Aufspaltung von Threads.Simply calling send activity from within the on send activities handler causes an infinite forking of threads. Sie können dieses Problem auf verschiedene Weise umgehen, z. B. durch Anfügen zusätzlicher Meldungen an die ausgehenden Informationen oder durch das Schreiben an einen anderen Speicherort wie die Konsole oder eine Datei, um einen Absturz Ihres Bots zu vermeiden.There are ways you can work around that problem, such as by appending additional messages to the outgoing information or writing out to another location like the console or a file to avoid crashing your bot.

Nächste SchritteNext steps

Zusätzliche RessourcenAdditional resources