使用活動處理程式的事件驅動交談

適用於: SDK v4

活動處理程式是組織 Bot 交談邏輯的事件驅動方式。 活動的每個不同類型或子類型都代表不同類型的交談事件。 實際上,Bot 的 回合處理程式 會針對所接收的任何活動類型呼叫個別活動處理程式。

例如,如果 Bot 收到訊息活動,回合處理程式就會看到傳入活動,並將它傳送至 訊息活動 活動處理程式。 建置 Bot 時,用於處理和回應訊息的 Bot 邏輯會在此訊息 活動 處理程式中。 同樣地,處理要新增至交談之成員的邏輯將會進入您在 加入成員 的處理程式中,每當成員加入至交談時,就會呼叫該處理程式。

如需組織 Bot 邏輯的其他方式,請參閱 Bot 運作方式中的 Bot 邏輯一節。

注意

Bot Framework JavaScript、C# 和 Python SDK 將會繼續受到支援,不過,Java SDK 即將淘汰,最終長期支援將於 2023 年 11 月結束。

使用 Java SDK 建置的現有 Bot 將繼續運作。

針對新的 Bot 建置,請考慮使用 Power Virtual Agents ,並閱讀 選擇正確的聊天機器人解決方案

如需詳細資訊,請參閱 Bot 建置的未來。

若要實作這些處理程式的邏輯,您會在 Bot 中覆寫這些方法,例如下面的 範例活動處理程式 一節。 針對每個處理程式,沒有基底實作,因此只要在覆寫中新增您想要的邏輯即可。

在某些情況下,您會想要覆寫基底回合處理程式,例如 在回合結束時儲存狀態 。 這樣做時,請務必先呼叫 await base.OnTurnAsync(turnContext, cancellationToken); ,確定的基底實作 OnTurnAsync 會在您的其他程式碼之前執行。 該基底實作是負責呼叫其他活動處理程式,例如 OnMessageActivityAsync

活動處理

Bot 邏輯會處理來自一或多個通道的連入活動,併產生傳出活動以回應。

主要 Bot 邏輯定義於 Bot 程式代碼中。 若要實作 Bot 作為活動處理程式,請從 ActivityHandler衍生 Bot 類別,以實作 IBot 介面。 ActivityHandler 針對不同類型的活動定義各種處理程式,例如 OnMessageActivityAsync、 和 OnMembersAddedAsync。 這些方法受到保護,但可以覆寫,因為我們衍生自 ActivityHandler

ActivityHandler 定義的處理程式如下:

活動 處理常式 描述
收到的任何活動類型 OnTurnAsync 根據收到的活動類型,呼叫其他處理程式之一。
已接收的訊息活動 OnMessageActivityAsync 覆寫此項目以處理 message 活動。
已接收交談更新活動 OnConversationUpdateActivityAsync conversationUpdate在活動上,如果 Bot 加入或離開交談以外的成員,則會呼叫處理程式。
非 Bot 成員已加入交談 OnMembersAddedAsync 覆寫此項目以處理加入交談的成員。
非 Bot 成員離開交談 OnMembersRemovedAsync 覆寫此選項以處理離開交談的成員。
已接收的事件活動 OnEventActivityAsync event在活動上,呼叫事件類型特定的處理程式。
已接收令牌回應事件活動 OnTokenResponseEventAsync 覆寫此項目以處理令牌回應事件。
收到非令牌回應事件活動 OnEventAsync 覆寫此選項以處理其他類型的事件。
已接收訊息反應活動 OnMessageReactionActivityAsync messageReaction在活動上,如果已新增或移除訊息中的一或多個回應,則呼叫處理程式。
新增至訊息的訊息反應 OnReactionsAddedAsync 覆寫此選項以處理新增至訊息的反應。
訊息回應已從訊息中移除 OnReactionsRemovedAsync 覆寫此選項以處理從訊息中移除的反應。
已接收安裝更新活動 OnInstallationUpdateActivityAsync installationUpdate在活動上,根據 Bot 是否已安裝或卸載,呼叫處理程式。
已安裝 Bot OnInstallationUpdateAddAsync 覆寫此選項,以在組織單位內安裝 Bot 時新增邏輯。
已卸載 Bot OnInstallationUpdateRemoveAsync 覆寫此選項,以在組織單位內卸載 Bot 時新增邏輯。
收到的其他活動類型 OnUnrecognizedActivityTypeAsync 覆寫此選項以處理任何未處理的活動類型。

這些不同的處理程式具有 turnContext ,提供傳入活動的相關信息,其對應至輸入 HTTP 要求。 活動可以是各種類型,因此每個處理程式都會在其回合內容參數中提供強型別活動;在大部分情況下, OnMessageActivityAsync 一律會處理,而且通常是最常見的。

如同此架構的舊版 4.x,也有可實作公用方法 的選項 OnTurnAsync。 目前,此方法的基底實作會處理錯誤檢查,然後根據傳入活動的類型呼叫每個特定處理程式(例如我們在此範例中定義的兩個處理程式)。 在大部分情況下,您可以將該方法單獨使用,並使用個別處理程式,但如果您的情況需要的自定義實 OnTurnAsync作,它仍然是一個選項。

重要

如果您覆寫 OnTurnAsync 方法,您必須呼叫 base.OnTurnAsync 以取得基底實作,以呼叫所有其他 On<activity>Async 處理程式或自行呼叫這些處理程式。 否則,不會呼叫這些處理程式,而且不會執行該程序代碼。

範例活動處理程式

例如,您可以處理 新增 至歡迎使用者交談的成員,並處理 訊息 以回應他們傳送給 Bot 的訊息。

public class EchoBot : ActivityHandler
{
    protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        var replyText = $"Echo: {turnContext.Activity.Text}";
        await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
    }

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        var welcomeText = "Hello and welcome!";
        foreach (var member in membersAdded)
        {
            if (member.Id != turnContext.Activity.Recipient.Id)
            {
                await turnContext.SendActivityAsync(MessageFactory.Text(welcomeText, welcomeText), cancellationToken);
            }
        }
    }
}

下一步

  • Microsoft Teams 頻道引進一些 Teams 特定活動,您的 Bot 必須支援才能與 Teams 正常運作。 若要了解開發 Microsoft Teams Bot 的重要概念,請參閱 Microsoft Teams Bot 的運作方式
  • 活動處理程式是設計不需要追蹤回合之間對話狀態的 Bot 的好方法。 dialogs 連結庫提供方式來管理與用戶長時間執行的交談。