Bot Framework V4: значение не может быть нулевым. (Параметр uriString)

Я следовал руководству (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 не влияет на доступные параметры.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 194
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Определено, что экземпляр IConfiguration, который был настроен и создан в конструкторе Startup.cs, не использовался, когда в IConfiguration происходило внедрение зависимостей. Это приводило к тому, что новые добавленные файлы конфигурации были недоступны.

Добавлен

services.AddSingleton<IConfiguration>(Configuration);

В ConfigureServices из Startup.cs, чтобы был получен правильный объект и были доступны значения.

Ветка skill-setting-issue Git Repo была обновлена, чтобы отразить это.

Этот Пост помог определить проблему.

Другие вопросы по теме