Получение нескольких ошибок 404 и 405 в Teams Bot

#node.js #botframework #azure-application-insights #microsoft-teams

#node.js #botframework #azure-application-insights #microsoft-teams

Вопрос:

Я провожу некоторое расследование в отношении Teams Bot, который в настоящее время находится у меня в разработке. Я вижу много ошибок 404, а в некоторых других случаях и 405, когда смотрю в Application Insights — я пытаюсь понять, не пропустил ли я что-нибудь.

введите описание изображения здесь

У меня для службы приложений установлено значение «Всегда включено», поэтому я предполагаю, что она опрашивает службу каждые 5 минут, чтобы она не работала вхолостую. Однако я вижу множество сбоев 404, в частности, указывающих на конечную точку GET /, а в других случаях также ошибку 405, которая указывает на конечную точку api / messages.

У меня есть идентификатор приложения и пароль приложения, установленные в переменных среды, и я также настроил хранилище, используя Cosmos DB, как показано на index.js файл ниже. Я также проверил манифест Teams, чтобы убедиться, что он указывает на идентификатор бота, и недавно добавил домен бота, чтобы посмотреть, имеет ли это значение.

 const restify = require('restify');
const path = require('path');

// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { BotFrameworkAdapter, ConversationState, UserState } = require('botbuilder');

// Import required services for bot telemetry
const { ApplicationInsightsTelemetryClient, TelemetryInitializerMiddleware } = require('botbuilder-applicationinsights');
const { TelemetryLoggerMiddleware, NullTelemetryClient } = require('botbuilder-core');

// Import our custom bot class that provides a turn handling function.
const { DialogBot } = require('./bots/dialogBot');
const { ProvisioningProfileDialog } = require('./dialogs/provisioningProfileDialog');

// Read environment variables from .env file
const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

// Create the adapter. See https://aka.ms/about-bot-adapter to learn more about using information from
// the .bot file when configuring your adapter.
const adapter = new BotFrameworkAdapter({
    appId: process.env.MicrosoftAppId,
    appPassword: process.env.MicrosoftAppPassword
});

// Define the state store for your bot.
const { CosmosDbPartitionedStorage } = require('botbuilder-azure');

const cosmosStorage = new CosmosDbPartitionedStorage({
    cosmosDbEndpoint: process.env.CosmosDbEndpoint,
    authKey: process.env.CosmosDbAuthKey,
    databaseId: process.env.CosmosDbDatabaseId,
    containerId: process.env.CosmosDbContainerId,
    compatibilityMode: false
});

// Create conversation state with storage provider.
const conversationState = new ConversationState(cosmosStorage);
const userState = new UserState(cosmosStorage);

// Create the main dialog.
const dialog = new ProvisioningProfileDialog(userState);
const bot = new DialogBot(conversationState, userState, dialog);
dialog.telemetryClient = telemetryClient;

// Catch-all for errors.
const onTurnErrorHandler = async (context, error) => {
    // This check writes out errors to console log .vs. app insights.
    // NOTE: In production environment, you should consider logging this to Azure
    //       application insights.
    console.error(`n [onTurnError] unhandled error: ${ error }`);

    // Send a trace activity, which will be displayed in Bot Framework Emulator
    await context.sendTraceActivity(
        'OnTurnError Trace',
        `${ error }`,
        'https://www.botframework.com/schemas/error',
        'TurnError'
    );

    // Send a message to the user
    await context.sendActivity('The bot encountered an error or bug.');
    await context.sendActivity('To continue to run this bot, please fix the bot source code.');
    // Clear out state
    await conversationState.delete(context);
};

// Set the onTurnError for the singleton BotFrameworkAdapter.
adapter.onTurnError = onTurnErrorHandler;

// Add telemetry middleware to the adapter middleware pipeline
var telemetryClient = getTelemetryClient(process.env.InstrumentationKey);
var telemetryLoggerMiddleware = new TelemetryLoggerMiddleware(telemetryClient);
var initializerMiddleware = new TelemetryInitializerMiddleware(telemetryLoggerMiddleware);
adapter.use(initializerMiddleware);

// Creates a new TelemetryClient based on a instrumentation key
function getTelemetryClient(instrumentationKey) {
    if (instrumentationKey) {
        return new ApplicationInsightsTelemetryClient(instrumentationKey);
    }
    return new NullTelemetryClient();
}

// Create HTTP server.
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function() {
    console.log(`n${ server.name } listening to ${ server.url }.`);
    console.log('nGet Bot Framework Emulator: https://aka.ms/botframework-emulator');
    console.log('nTo talk to your bot, open the emulator select "Open Bot"');
});

// Listen for incoming requests.
server.post('/api/messages', (req, res) => {
    adapter.processActivity(req, res, async (context) => {
        // Route the message to the bot's main handler.
        await bot.run(context);
    });
});
  

Хотя бот, похоже, работает нормально по большей части, я что-то упускаю из виду с этими ошибками или это ожидаемое поведение, поскольку он запрашивает ответ?

Заранее спасибо

Комментарии:

1. Не могли бы вы, пожалуйста, проверить, настроены ли у вас тесты доступности ?

Ответ №1:

  1. Содержит ли ваш бот также веб-страницу? Образцы узлов этого не делают, но .В сетевых примерах это так. Если нет, то, конечно, имело бы смысл получить ошибку 404. Я склонен согласиться с вами, что причиной может быть опрос.
  2. Обычно боты (особенно созданные на основе шаблона или образца) не обрабатывают конечные точки ПОЛУЧЕНИЯ в / api / messages. Все обрабатывается с помощью POST.

Комментарии:

1. Спасибо за ответ. У меня нет веб-страницы в моем развертывании (она использует Node). Возможно, это глупый вопрос, но может ли быть так, что мой Teams Bot был развернут как бот веб-приложения? Насколько я понимаю, каналы ботов используются, когда боты размещаются в другом месте, а не в Azure?!

2. Канал — это соединение между коммуникационным приложением и ботом. В списке представлено несколько стандартных наборов каналов на выбор. Для получения более подробной информации о каналах, пожалуйста, ознакомьтесь с этой документацией .