Я следовал руководству (Bot Framework Integrate Composer Into Skill Project), чтобы интегрировать диалоги композитора с проектом навыков. Это включает в себя созданные композитором диалоги, которые вызывают навык. Я сталкиваюсь с исключением «Значение не может быть нулевым (параметр« uriString »)» при вызове навыка.
Я столкнулся с различными другими проблемами при настройке, как указано здесь Предыдущие проблемы, которые были решены, хотя мне пришлось поработать, чтобы настройки заработали. Теперь мне нужно определить, почему параметры конфигурации не разрешаются.
Чтобы воссоздать проблему, используйте ветку «skill-setting-issue» репозитория Git Repo
Предпосылки
Установите эмулятор бота:Инструкции по установке эмулятора бота
Откройте файл решения в Visual Studio Integrate-Composer-Dialog-Using-Skill.sln.
Поставьте точку останова в строке 79 файла DefaultAdapter.cs — здесь можно увидеть ошибку.
Начать отладку проекта
Открыть эмулятор бота
Подключиться к боту: http://localhost:3978/api/messages
Введите «Приветствие»
Бот должен ответить «Здравствуйте, я понял, что вы сказали приветствие» — это означает, что интеграция диалогового окна композитора работает должным образом.
Введите «Навык»
Точка останова в строке 79 файла DefaultAdapter.cs должна инициировать предоставление подробной информации об ошибке.
Похоже, ошибка возникает из-за того, что значения настроек в Composer-With-Skill.dialog между строками 52 и 57 не могут быть разрешены.
"botId": "=settings.MicrosoftAppId",
"skillHostEndpoint": "=settings.skillHostEndpoint",
"connectionName": "=settings.connectionName",
"allowInterruptions": true,
"skillEndpoint": "=settings.skill['integrateComposerDialogUsingSkill'].endpointUrl",
"skillAppId": "=settings.skill['integrateComposerDialogUsingSkill'].msAppId",
Если я заменю части, которые используют =settings.... фактическими значениями, тогда приложение заработает (см. ветку master для кода, который имеет эту настройку).
например
"botId": "=settings.MicrosoftAppId",
"skillHostEndpoint": "http://localhost:3978/api/skills",
"connectionName": "=settings.connectionName",
"allowInterruptions": true,
"skillEndpoint": "http://localhost:3978/api/echo/messages",
"skillAppId": "00000000-0000-0000-0000-000000000000",
Обратите внимание, что botId и connectionName не используются, поэтому не вызывают ошибок во время выполнения.
Эти значения должны быть получены из ComposerDialogs\settings\appsettings.json строки с 67 по 79.
"skill": {
"integrateComposerDialogUsingSkill": {
"endpointUrl": "http://localhost:3978/api/echo/messages",
"msAppId": "00000000-0000-0000-0000-000000000000"
}
},
"defaultLanguage": "en-us",
"languages": [
"en-us"
],
"customFunctions": [],
"skillHostEndpoint": "http://localhost:3978/api/skills"
}
ComposerDialogs\settings\appsettings.json был настроен как файл настроек в приложении в строке 51 Startup.cs в соответствии с руководством, которому я следую.
public class Startup
{
public Startup(IWebHostEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddJsonFile("cognitivemodels.json", optional: true)
.AddJsonFile($"cognitivemodels.{env.EnvironmentName}.json", optional: true)
//from instructions: https://microsoft.github.io/botframework-solutions/skills/handbook/experimental-add-composer/
.AddJsonFile($"ComposerDialogs\\settings\\appsettings.json", optional: true)
.AddEnvironmentVariables();
Я не уверен, почему переменные в файле Composer-With-Skill.dialog не разрешаются значениями настроек в ComposerDialogs\settings\appsettings.json
Ошибка возникает в строке 156 файла Microsoft.Bot.Builder.Dialogs.Adaptive.BeginSkill в методе BeginDialogAsync. Bot Builder Git — BeginSkill.cs когда код пытается заполнить значение DialogOptions.SkillHostEndpoint.
public override async Task<DialogTurnResult> BeginDialogAsync(DialogContext dc, object options = null, CancellationToken cancellationToken = default)
{
if (Disabled != null && Disabled.GetValue(dc.State))
{
return await dc.EndDialogAsync(cancellationToken: cancellationToken).ConfigureAwait(false);
}
// Update the dialog options with the runtime settings.
DialogOptions.BotId = BotId.GetValue(dc.State);
DialogOptions.SkillHostEndpoint = new Uri(SkillHostEndpoint.GetValue(dc.State));
DialogOptions.ConversationIdFactory = dc.Context.TurnState.Get<SkillConversationIdFactoryBase>() ?? throw new NullReferenceException("Unable to locate SkillConversationIdFactoryBase in HostContext");
DialogOptions.SkillClient = dc.Context.TurnState.Get<BotFrameworkClient>() ?? throw new NullReferenceException("Unable to locate BotFrameworkClient in HostContext");
DialogOptions.ConversationState = dc.Context.TurnState.Get<ConversationState>() ?? throw new NullReferenceException($"Unable to get an instance of {nameof(ConversationState)} from TurnState.");
DialogOptions.ConnectionName = ConnectionName.GetValue(dc.State);
Обновлено: установка значения «skillHostEndpoint»: «http://localhost:3978/api/skills» в основной файл appsettings.json приводит к тому, что код работает.
Обновлено: перемещение ComposerDialogs/settings/appsettings.json в основную папку и переименование в appsettings-composer.json и настройка startup.cs не помогает
Обновлено: удаление .AddJsonFile("appsettings.json", необязательно: true, reloadOnChange: true) не препятствует доступности настроек приложения в BeginSkill.cs. Таким образом, это указывает на то, что настройка построителя в Startup.cs не влияет на доступные параметры.





Определено, что экземпляр IConfiguration, который был настроен и создан в конструкторе Startup.cs, не использовался, когда в IConfiguration происходило внедрение зависимостей. Это приводило к тому, что новые добавленные файлы конфигурации были недоступны.
Добавлен
services.AddSingleton<IConfiguration>(Configuration);
В ConfigureServices из Startup.cs, чтобы был получен правильный объект и были доступны значения.
Ветка skill-setting-issue Git Repo была обновлена, чтобы отразить это.
Этот Пост помог определить проблему.