Como funcionam os botsHow bots work

APLICA-SE A: simv4 SDK não v3 SDK APPLIES TO: yesSDK v4 no SDK v3

Um bot é um aplicativo com o qual os usuários interagem de maneira conversacional usando texto, gráficos (cartões ou imagens) ou fala.A bot is an app that users interact with in a conversational way, using text, graphics (such as cards or images), or speech. Cada interação entre o usuário e o bot gera uma atividade.Every interaction between the user and the bot generates an activity. O Serviço do Bot Framework, que é um componente do Serviço de Bot do Azure, envia informações entre o aplicativo do usuário conectado ao bot (como Facebook, Skype, Slack e outros, que chamamos de canal) e o bot.The Bot Framework Service, which is a component of the Azure Bot Service, sends information between the user's bot-connected app (such as Facebook, Skype, Slack, etc. which we call the channel) and the bot. Cada canal pode incluir informações adicionais nas atividades que enviam.Each channel may include additional information in the activities they send. Antes de criar bots, é importante entender como um bot usa objetos de atividade para se comunicar com seus usuários.Before creating bots, it is important to understand how a bot uses activity objects to communicate with its users. Vamos primeiro dar uma olhada nas atividades que são trocadas quando executamos um bot de eco simples.Let's first take a look at activities that are exchanged when we run a simple echo bot.

diagrama de atividade

Dois tipos de atividade ilustrados aqui são: atualização de conversa e mensagem.Two activity types illustrated here are: conversation update and message.

O serviço Bot Framework pode enviar uma atualização de conversa quando um participante ingressa na conversa.The Bot Framework Service may send a conversation update when a party joins the conversation. Por exemplo, ao iniciar uma conversa com o Bot Framework Emulator, você verá duas atividades de atualização de conversa (uma para o usuário que participa da conversa e outra para o bot que participa da conversa).For example, on starting a conversation with the Bot Framework Emulator, you will see two conversation update activities (one for the user joining the conversation and one for the bot joining). Para distinguir essas atividades de atualização de conversa, verifique se a propriedade members added inclui um membro que não seja o bot.To distinguish these conversation update activities, check whether the members added property includes a member other than the bot.

A atividade de mensagem contém informações de conversa entre as partes.The message activity carries conversation information between the parties. Em um exemplo de bot de eco, as atividades de mensagem transmitem texto simples e o canal renderiza esse texto.In an echo bot example, the message activities are carrying simple text and the channel will render this text. Como alternativa, a atividade de mensagem pode conter o texto a ser falado, as ações sugeridas ou os cartões a serem exibidos.Alternatively, the message activity might carry text to be spoken, suggested actions or cards to be displayed.

Neste exemplo, o bot criou e enviou uma atividade de mensagem em resposta à atividade de mensagem de entrada que ele recebeu.In this example, the bot created and sent a message activity in response to the inbound message activity it had received. No entanto, um bot pode responder de outras maneiras a uma atividade de mensagem recebida. Não é incomum para um bot responder a uma atividade de atualização de conversa enviando um texto de boas-vindas em uma atividade de mensagem.However, a bot can respond in other ways to a received message activity; it’s not uncommon for a bot to respond to a conversation update activity by sending some welcome text in a message activity. Mais informações podem ser encontradas nas boas-vindas ao usuário.More information can be found in welcoming the user.

Detalhes do HTTPHTTP Details

As atividades chegam ao bot do serviço Bot Framework por meio de uma solicitação HTTP POST.Activities arrive at the bot from the Bot Framework Service via an HTTP POST request. O bot responde à solicitação POST de entrada com um código de status HTTP 200.The bot responds to the inbound POST request with a 200 HTTP status code. As atividades enviadas do bot para o canal são enviadas em uma HTTP POST separada para o serviço Bot Framework.Activities sent from the bot to the channel are sent on a separate HTTP POST to the Bot Framework Service. Isso, por sua vez, é confirmado com um código de status HTTP 200.This, in turn, is acknowledged with a 200 HTTP status code.

O protocolo não especifica a ordem em que as solicitações POST e suas confirmações são feitas.The protocol doesn’t specify the order in which these POST requests and their acknowledgments are made. No entanto, para se ajustar a estruturas de serviço HTTP comuns, essas solicitações normalmente são aninhadas, o que significa que a solicitação HTTP de saída é feita do bot dentro do escopo da solicitação HTTP de entrada.However, to fit with common HTTP service frameworks, typically these requests are nested, meaning that the outbound HTTP request is made from the bot within the scope of the inbound HTTP request. Esse padrão é ilustrado no diagrama acima.This pattern is illustrated in the diagram above. Como há duas conexões HTTP distintas de ponta a ponta, o modelo de segurança deve servir a ambas.Since there are two distinct HTTP connections back to back, the security model must provide for both.

Definir um turnoDefining a turn

Em uma conversa, as pessoas geralmente falam uma de cada vez, alternando a vez de falar.In a conversation, people often speak one-at-a-time, taking turns speaking. Com um bot, geralmente ele reage à entrada do usuário.With a bot, it generally reacts to user input. Dentro do SDK do Bot Framework, um turno é a atividade de entrada do usuário para o bot e qualquer atividade que o bot envia de volta para o usuário como uma resposta imediata.Within the Bot Framework SDK, a turn consists of the user's incoming activity to the bot and any activity the bot sends back to the user as an immediate response. Você pode considerar um turno como o processamento associado à chegada de uma determinada atividade.You can think of a turn as the processing associated with the arrival of a given activity.

O objeto contexto de turno fornece informações sobre a atividade, como o remetente e o receptor, o canal e outros dados necessários para processar a atividade.The turn context object provides information about the activity such as the sender and receiver, the channel, and other data needed to process the activity. Ele também permite a adição de informações durante o turno em várias camadas do bot.It also allows for the addition of information during the turn across various layers of the bot.

O contexto de turno é uma das abstrações mais importantes no SDK.The turn context is one of the most important abstractions in the SDK. Não só ele transmite a atividade de entrada para todos os componentes de middleware e a lógica do aplicativo, mas também fornece o mecanismo pelo qual os componentes de middleware e a lógica do aplicativo podem enviar atividades de saída.Not only does it carry the inbound activity to all the middleware components and the application logic but it also provides the mechanism whereby the middleware components and the application logic can send outbound activities.

A pilha de processamento de atividadeThe activity processing stack

Vamos analisar o diagrama anterior, com foco na chegada de uma atividade de mensagem.Let's drill into the previous diagram with a focus on the arrival of a message activity.

pilha de processamento de atividade

No exemplo acima, o bot respondeu à atividade de mensagem com outra atividade de mensagem contendo a mesma mensagem de texto.In the example above, the bot replied to the message activity with another message activity containing the same text message. O processamento começa com a solicitação HTTP POST, com as informações de atividade transmitidas como uma carga JSON, chegando ao servidor Web.Processing starts with the HTTP POST request, with the activity information carried as a JSON payload, arriving at the web server. Em C#, isso geralmente será um projeto do ASP.NET e, em um projeto Node.js do JavaScript, isso costuma ser uma das estruturas populares, como Express ou Restify.In C# this will typically be an ASP.NET project, in a JavaScript Node.js project this is likely to be one of the popular frameworks such as Express or Restify.

O adaptador, um componente integrado do SDK, é o núcleo do runtime do SDK.The adapter, an integrated component of the SDK, is the core of the SDK runtime. A atividade é executada como JSON no corpo HTTP POST.The activity is carried as JSON in the HTTP POST body. Este JSON é desserializado para criar o objeto Atividade, que é entregue ao adaptador com uma chamada para o método processar atividade.This JSON is deserialized to create the Activity object that is then handed to the adapter with a call to process activity method. Ao receber a atividade, o adaptador cria um contexto de turno e chama o middleware.On receiving the activity, the adapter creates a turn context and calls the middleware.

Conforme mencionado acima, o contexto de turno fornece o mecanismo para que o bot envie atividades de saída, geralmente em resposta a uma atividade de entrada.As mentioned above, the turn context provides the mechanism for the bot to send outbound activities, most often in response to an inbound activity. Para isso, o contexto de turno fornece métodos de resposta enviar, atualizar e excluir atividade.To achieve this, the turn context provides send, update, and delete activity response methods. Cada método de resposta é executado em um processo assíncrono.Each response method runs in an asynchronous process.

Importante

O encadeamento que manipula o giro do bot primário lida com a disposição do objeto de contexto quando isso é feito.The thread handling the primary bot turn deals with disposing of the context object when it is done. Certifique-se de await todas as chamadas de atividade para que o segmento principal espere na atividade gerada antes de terminar o processamento e a eliminação do contexto de turno.Be sure to await any activity calls so the primary thread will wait on the generated activity before finishing its processing and disposing of the turn context. Caso contrário, se uma resposta (incluindo seus manipuladores) demora um tempo significativo e tenta agir no objeto de contexto, ela pode receber um erro de contexto descartado.Otherwise, if a response (including its handlers) takes any significant amount of time and tries to act on the context object, it may get a context was disposed error.

Manipuladores de atividadeActivity handlers

Quando o bot recebe uma atividade, ele a transmite a seus manipuladores de atividade.When the bot receives an activity, it passes it on to its activity handlers. Nos bastidores, há um manipulador base chamado de manipulador de turno.Under the covers, there is one base handler called the turn handler. Todas as atividades são encaminhadas por ele.All activities get routed through there. Esse manipulador de turno chama o manipulador de atividade específico para qualquer tipo de atividade recebida.That turn handler then calls the individual activity handler for whatever type of activity it received.

Por exemplo, se o bot recebe uma atividade de mensagem, o manipulador de turno vê a atividade de entrada a envia para o manipulador de atividade OnMessageActivityAsync.For example, if the bot receives a message activity, the turn handler would see that incoming activity and send it to the OnMessageActivityAsync activity handler.

Ao criar seu bot, sua lógica do bot para tratar das mensagens e respondê-las entrará nesse manipulador OnMessageActivityAsync.When building your bot, your bot logic for handling and responding to messages will go in this OnMessageActivityAsync handler. Da mesma forma, sua lógica de tratamento de membros que estão sendo adicionados à conversa vai entrar no manipulador OnMembersAddedAsync, que é chamado sempre que um membro é adicionado à conversa.Likewise, your logic for handling members being added to the conversation will go in your OnMembersAddedAsync handler, which is called whenever a member is added to the conversation.

Para implementar a lógica desses manipuladores, você substituirá esses métodos no seu bot como visto na seção Lógica do bot abaixo.To implement your logic for these handlers, you will override these methods in your bot as seen in the Bot logic section below. Para cada um desses manipuladores, não há nenhuma implementação base e, portanto, basta adicionar a lógica desejada na substituição.For each of these handlers, there is no base implementation, so just add the logic that you want in your override.

Há algumas situações em que é melhor substituir o manipulador de turno base, por exemplo, ao salvar o estado no final de um turno.There are certain situations where you will want to override the base turn handler, such as saving state at the end of a turn. Ao fazer isso, chame primeiro await base.OnTurnAsync(turnContext, cancellationToken); para fazer com que a implementação base de OnTurnAsync seja executada antes do código adicional.When doing so, be sure to first call await base.OnTurnAsync(turnContext, cancellationToken); to make sure the base implementation of OnTurnAsync is run before your additional code. A implementação base é, entre outras coisas, responsável por chamar o resto dos manipuladores de atividade, como OnMessageActivityAsync.That base implementation is, among other things, responsible for calling the rest of the activity handlers such as OnMessageActivityAsync.

MiddlewareMiddleware

O Middleware é muito parecido com qualquer outro middleware de mensagens, compreendendo um conjunto linear de componentes que são executados em ordem, dando a cada um a chance de operar na atividade.Middleware is much like any other messaging middleware, comprising a linear set of components that are each executed in order, giving each a chance to operate on the activity. O estágio final do pipeline de middleware é um retorno de chamada para o manipulador de turno na classe do bot que o aplicativo registrou com o método processar atividade do adaptador.The final stage of the middleware pipeline is a callback to the turn handler on the bot class the application has registered with the adapter's process activity method. O manipulador de turno é geralmente OnTurnAsync em C# e onTurn em JavaScript.The turn handler is generally OnTurnAsync in C# and onTurn in JavaScript.

O manipulador de turnos recebe um contexto de turno como seu argumento, normalmente a lógica do aplicativo em execução na função do manipulador de turnos processará o conteúdo da atividade de entrada e gerará uma ou mais atividades em resposta, enviando-as usando a função enviar atividade no contexto do turno.The turn handler takes a turn context as its argument, typically the application logic running inside the turn handler function will process the inbound activity’s content and generate one or more activities in response, sending these out using the send activity function on the turn context. Chamar enviar atividade no contexto de turno faz com que os componentes de middleware sejam invocados nas atividades de saída.Calling send activity on the turn context will cause the middleware components to be invoked on the outbound activities. Os componentes de middleware são executados antes e depois da função do manipulador de turno do bot.Middleware components execute before and after the bot’s turn handler function. A execução é aninhada de forma inerente e, por isso, às vezes é chamada de Boneca Russa.The execution is inherently nested and, as such, sometimes referred to being like a Russian Doll. Para obter mais informações detalhadas sobre o middleware, consulte o tópico sobre middleware.For more in depth information about middleware, see the middleware topic.

Estrutura do botBot structure

Nas seções a seguir, examinaremos partes essenciais de um EchoBot que você pode criar facilmente usando os modelos fornecidos para CSharp ou JavaScript.In the following sections, we examine key pieces of an EchoBot that you can easily create using the templates provided for CSharp or JavaScript.

Um bot é um aplicativo Web, e fornecemos modelos a cada linguagem.A bot is a web application, and we provide templates for each language.

O modelo VSIX gera um aplicativo Web ASP.NET MVC Core.The VSIX template generates a ASP.NET MVC Core web app. Se você examinar os conceitos básicos do ASP.NET, verá um código semelhante em arquivos como Program.cs e Startup.cs.If you look at the ASP.NET fundamentals, you'll see similar code in files such as Program.cs and Startup.cs. Esses arquivos são necessários para todos os aplicativos Web e não são específicos do bot.These files are required for all web apps and are not bot specific.

Arquivo appsettings.jsonappsettings.json file

O arquivo appsettings.json especifica as informações de configuração para o bot, como a ID do aplicativo e a senha, entre outras coisas.The appsettings.json file specifies the configuration information for your bot, such as the app ID, and password among other things. Se estiver usando algumas tecnologias ou este bot em produção, você precisará adicionar suas chaves específicas ou a URL a essa configuração.If using certain technologies or using this bot in production, you will need to add your specific keys or URL to this configuration. No entanto, para este bot Eco, você não precisa fazer nada aqui no momento; a ID do aplicativo e a senha podem ser deixadas indefinidas por enquanto.For this Echo bot, however, you don't need to do anything here right now; the app ID and password may be left undefined at this time.

Lógica do botBot logic

A lógica do bot processa as atividades de entrada de um ou mais canais e gera atividades de saída em resposta.The bot logic processes incoming activities from one or more channels and generates outgoing activities in response.

A lógica principal do bot é definida no código do bot; aqui, ele se chama Bots/EchoBot.cs.The main bot logic is defined in the bot code, here called Bots/EchoBot.cs. EchoBot deriva de ActivityHandler, que por sua vez deriva da interface IBot.EchoBot derives from ActivityHandler, which in turn derives from the IBot interface. ActivityHandler define vários manipuladores para diferentes tipos de atividades, como os dois definidos aqui: OnMessageActivityAsync e OnMembersAddedAsync.ActivityHandler defines various handlers for different types of activities, such as the two defined here: OnMessageActivityAsync, and OnMembersAddedAsync. Esses métodos são protegidos, mas podem ser substituídos, já que estamos derivando de ActivityHandler.These methods are protected, but can be overwritten since we're deriving from ActivityHandler.

Os manipuladores definidos em ActivityHandler são:The handlers defined in ActivityHandler are:

EventoEvent ManipuladorHandler DESCRIÇÃODescription
Qualquer tipo de atividade recebidoAny activity type received OnTurnAsync Chama um dos outros manipuladores com base no tipo de atividade recebido.Calls one of the other handlers, based on the type of activity received.
Atividade de mensagem recebidaMessage activity received OnMessageActivityAsync Substitua-o para lidar com uma atividade message.Override this to handle a message activity.
Atividade de atualização de conversa recebidaConversation update activity received OnConversationUpdateActivityAsync Em uma atividade conversationUpdate, chama um manipulador se algum membro que não seja o bot ingressa na conversa ou sai dela.On a conversationUpdate activity, calls a handler if members other than the bot joined or left the conversation.
Membros que não são bot ingressaram na conversaNon-bot members joined the conversation OnMembersAddedAsync Substitua-o para lidar com membros que ingressam em uma conversa.Override this to handle members joining a conversation.
Membros que não são bot saíram da conversaNon-bot members left the conversation OnMembersRemovedAsync Substitua-o para lidar com membros que saem de uma conversa.Override this to handle members leaving a conversation.
Atividade de evento recebidaEvent activity received OnEventActivityAsync Em uma atividade event, chama um manipulador específico ao tipo de evento.On an event activity, calls a handler specific to the event type.
Atividade de evento de resposta de token recebidaToken-response event activity received OnTokenResponseEventAsync Substitua-o para manipular eventos de resposta de token.Override this to handle token response events.
Atividade de evento de resposta não token recebidaNon-token-response event activity received OnEventAsync Substitua-o para lidar com outros tipos de eventos.Override this to handle other types of events.
Atividade de reação de mensagem recebidaMessage reaction activity received OnMessageReactionActivityAsync Em uma atividade messageReaction, chamará um manipulador se uma ou mais reações forem adicionadas ou removidas de uma mensagem.On a messageReaction activity, calls a handler if one or more reactions were added or removed from a message.
Reações de mensagem adicionadas a uma mensagemMessage reactions added to a message OnReactionsAddedAsync Substitua isso para manipular reações adicionadas a uma mensagem.Override this to handle reactions added to a message.
Reações de mensagem removidas de uma mensagemMessage reactions removed from a message OnReactionsRemovedAsync Substitua isso para manipular reações removidas de uma mensagem.Override this to handle reactions removed from a message.
Outro tipo de atividade recebidoOther activity type received OnUnrecognizedActivityTypeAsync Substitua-o para lidar com qualquer tipo de atividade sem tratamento.Override this to handle any activity type otherwise unhandled.

Esses manipuladores diferentes têm um turnContext que fornece informações sobre a atividade de entrada, que corresponde à solicitação HTTP de entrada.These different handlers have a turnContext that provides information about the incoming activity, which corresponds to the inbound HTTP request. As atividades podem ser de vários tipos e, portanto, cada manipulador fornece uma atividade fortemente tipada em seu parâmetro de contexto de turno; na maioria dos casos, OnMessageActivityAsync sempre será manipulado e é geralmente o mais comum.Activities can be of various types, so each handler provides a strongly-typed activity in its turn context parameter; in most cases, OnMessageActivityAsync will always be handled, and is generally the most common.

Como nas versões anteriores de 4.x dessa estrutura, também há a opção de implementar o método público OnTurnAsync.As in previous 4.x versions of this framework, there is also the option to implement the public method OnTurnAsync. Atualmente, a implementação base desse método lida com a verificação de erros e, em seguida, chama cada um dos manipuladores específicos (como os dois que definimos neste exemplo) dependendo do tipo de atividade de entrada.Currently, the base implementation of this method handles error checking and then calls each of the specific handlers (like the two we define in this sample) depending on the type of incoming activity. Na maioria dos casos, você pode deixar esse método de lado e usar manipuladores individuais, mas se a situação exige uma implementação personalizada de OnTurnAsync, ele ainda é uma opção.In most cases, you can leave that method alone and use the individual handlers, but if your situation requires a custom implementation of OnTurnAsync, it is still an option.

Importante

Se você substituir o método OnTurnAsync, precisará chamar base.OnTurnAsync para obter a implementação base e chamar todos os outros manipuladores On<activity>Async, ou chamar esses manipuladores por conta própria.If you do override the OnTurnAsync method, you'll need to call base.OnTurnAsync to get the base implementation to call all the other On<activity>Async handlers or call those handlers yourself. Caso contrário, esses manipuladores não serão chamados e o código não será executado.Otherwise, those handlers won't be called and that code won't be run.

No exemplo, estamos recebendo um novo usuário ou ecoando a mensagem que o usuário enviou usando a chamada SendActivityAsync.In this sample, we welcome a new user or echo back the message the user sent using the SendActivityAsync call. A atividade de saída corresponde à solicitação HTTP POST de saída.The outbound activity corresponds to the outbound HTTP POST request.

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

    protected override async Task OnMembersAddedAsync(IList<ChannelAccount> membersAdded, ITurnContext<IConversationUpdateActivity> turnContext, CancellationToken cancellationToken)
    {
        foreach (var member in membersAdded)
        {
            await turnContext.SendActivityAsync(MessageFactory.Text($"welcome {member.Name}"), cancellationToken);
        }
    }
}

Acessar o bot no seu aplicativoAccess the bot from your app

Configurar serviçosSet up services

O método ConfigureServices no arquivo Startup.cs carrega os serviços conectados e suas chaves de appsettings.json ou do Azure Key Vault (se houver), conecta o estado e assim por diante.The ConfigureServices method in the Startup.cs file loads the connected services, as well as their keys from appsettings.json or Azure Key Vault (if there are any), connects state, and so on. Aqui estamos adicionando MVC e definindo a versão de compatibilidade em nossos serviços, configurando o adaptador e o bot para ficarem disponíveis para o controlador de bot por meio de injeção de dependência.Here, we're adding MVC and setting the compatibility version on our services, then setting up the adapter and bot to be available through dependency injection to the bot controller.

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    // Create the credential provider to be used with the Bot Framework Adapter.
    services.AddSingleton<ICredentialProvider, ConfigurationCredentialProvider>();

    // Create the Bot Framework Adapter.
    services.AddSingleton<IBotFrameworkHttpAdapter, BotFrameworkHttpAdapter>();

    // Create the bot as a transient. In this case the ASP Controller is expecting an IBot.
    services.AddTransient<IBot, EchoBot>();
}

O método Configure termina a configuração do aplicativo especificando que ele deve usar MVC e alguns outros arquivos.The Configure method finishes the configuration of your app by specifying that the app use MVC and a few other files. Todos os bots usando o Bot Framework precisarão dessa chamada de configuração; no entanto, ela já estará definida em exemplos ou no modelo VSIX quando você compilar seu bot.All bots using the Bot Framework will need that configuration call, however that will already be defined in samples or the VSIX template when you build your bot. ConfigureServices e Configure são chamados pelo runtime quando o aplicativo é iniciado.ConfigureServices and Configure are called by the runtime when the app starts.

Controlador de BotBot Controller

O controlador, seguindo a estrutura MVC padrão, permite que você determine o encaminhamento de mensagens e solicitações HTTP POST.The controller, following the standard MVC structure, lets you determine the routing of messages and HTTP POST requests. Para nosso bot, transmitimos a solicitação de entrada para o método processar atividade assíncrona conforme explicado na seção de pilha de processamento de atividade acima.For our bot, we pass the incoming request on to the adapter's process async activity method as explained in the activity processing stack section above. Nessa chamada, especificamos o bot e outras informações de autorização que possam ser necessárias.In that call, we specify the bot and any other authorization information that may be required.

O controlador implementa ControllerBase, contém o adaptador e o bot que definimos em Startup.cs (que estão disponíveis aqui por meio da injeção de dependência) e transmite as informações necessárias ao bot quando ele recebe uma entrada HTTP POST.The controller implements ControllerBase, holds the adapter and bot that we set in Startup.cs (that are available here through dependency injection), and passes the necessary information on to the bot when it receives an incoming HTTP POST.

Aqui, você verá a classe precedida de atributos de rota e controlador.Here, you'll see the class proceeded by route and controller attributes. Eles ajudam a estrutura encaminhar as mensagens adequadamente e saber qual controlador deve ser usado.These assist the framework to route the messages appropriately and know which controller to use. Se você alterar o valor no atributo de rota, alterará o ponto de extremidade que o emulador ou outros canais usam para acessar seu bot.If you change the value in the route attribute, that changes the endpoint the emulator or other channels use access your bot.

// This ASP Controller is created to handle a request. Dependency Injection will provide the Adapter and IBot
// implementation at runtime. Multiple different IBot implementations running at different endpoints can be
// achieved by specifying a more specific type for the bot constructor argument.
[Route("api/messages")]
[ApiController]
public class BotController : ControllerBase
{
    private readonly IBotFrameworkHttpAdapter Adapter;
    private readonly IBot Bot;

    public BotController(IBotFrameworkHttpAdapter adapter, IBot bot)
    {
        Adapter = adapter;
        Bot = bot;
    }

    [HttpPost]
    public async Task PostAsync()
    {
        // Delegate the processing of the HTTP POST to the adapter.
        // The adapter will invoke the bot.
        await Adapter.ProcessAsync(Request, Response, Bot);
    }
}

Gerenciar recursos do botManage bot resources

Os recursos de bot, como ID do aplicativo, senhas, chaves ou segredos para serviços conectados, precisarão ser gerenciados adequadamente.The bot resources, such as app ID, passwords, keys or secrets for connected services, will need to be managed appropriately. Para obter mais informações sobre como fazer isso, confira Gerenciar recursos de bot.For more on how to do so, see Manage bot resources.

Recursos adicionaisAdditional resources