#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:
- Содержит ли ваш бот также веб-страницу? Образцы узлов этого не делают, но .В сетевых примерах это так. Если нет, то, конечно, имело бы смысл получить ошибку 404. Я склонен согласиться с вами, что причиной может быть опрос.
- Обычно боты (особенно созданные на основе шаблона или образца) не обрабатывают конечные точки ПОЛУЧЕНИЯ в / api / messages. Все обрабатывается с помощью POST.
Комментарии:
1. Спасибо за ответ. У меня нет веб-страницы в моем развертывании (она использует Node). Возможно, это глупый вопрос, но может ли быть так, что мой Teams Bot был развернут как бот веб-приложения? Насколько я понимаю, каналы ботов используются, когда боты размещаются в другом месте, а не в Azure?!
2. Канал — это соединение между коммуникационным приложением и ботом. В списке представлено несколько стандартных наборов каналов на выбор. Для получения более подробной информации о каналах, пожалуйста, ознакомьтесь с этой документацией .