Как вызвать локальный API из Microsoft Bot C#

Я не могу выполнять вызовы локального API из MS Bot (v4) C# после развертывания в Azure. Вызов On Premise API отлично работает при локальном тестировании с помощью эмулятора.

По рекомендации службы поддержки Microsoft я уже пытался использовать канал Direct Line для веб-чата, но это не помогает.

                AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

                HttpWebRequest webRequest = HttpWebRequest.CreateHttp(updatedURL);
                webRequest.Method = currentStep.StepsServiceCall.Method;
                webRequest.ContentType = "application/json";
                webRequest.KeepAlive = true;

                if (!String.IsNullOrEmpty(currentStep.StepsServiceCall.Headers))
                {
                    string updatedJson = currentStep.InjectPropertyValuesJson(currentStep.StepsServiceCall.Headers, properties);

                    webRequest.ContentLength = updatedJson.Length;

                    using (var streamWriter = new StreamWriter(webRequest.GetRequestStream()))
                    {
                        streamWriter.Write(updatedJson);
                        streamWriter.Flush();
                        streamWriter.Close();
                    }
                }

                using (HttpWebResponse response = webRequest.GetResponse() as HttpWebResponse)
                {
                    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
                    {
                        string content = reader.ReadToEnd();

                        return await currentStep.ProcessResponseText(context, cancellationToken, content);
                    }

Получение следующей ошибки из журналов службы приложений Azure.

Microsoft.Bot.Builder.Integration.AspNet.Core.BotFrameworkHttpAdapter: Обнаружено исключение: при отправке запроса произошла ошибка. Ошибка 12029 при вызове WINHTTP_CALLBACK_STATUS_REQUEST_ERROR, «Не удалось установить соединение с сервером».

Вы пытались открыть свой On Permise API из-за пределов вашей текущей сети? Например, используя 3G с вашего телефона? Если вы находитесь в корпоративной сети, если кто-то не изменит конфигурацию сети, чтобы разрешить входящие подключения, Azure не сможет получить доступ к вашему API On Permise.

Paulo Correia 29.05.2019 12:37

Спасибо за ответ, Пауло. On Premise API недоступен за пределами сети организации. Какие настройки необходимо выполнить, чтобы Azure могла получить доступ к локальному API?

Sandeep 04.06.2019 12:40

Привет @Sandeep, вам нужно обратиться в свой ИТ-отдел, чтобы узнать, как предоставить ваш API для Azure. Конечно, у вас есть сервер, на котором размещен API, им потребуется выполнить некоторые настройки на уровне брандмауэра и маршрутизации, чтобы внешний запрос мог достигать вашего внутреннего сервера. В крайних случаях и для тестирования вы всегда можете попробовать использовать ngrok.com для разработки/тестирования. Я бы не рекомендовал использовать его в прямом эфире.

Paulo Correia 04.06.2019 19:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
3
322
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

На мой взгляд, сообщение об ошибке выглядит достаточно прямолинейно: ваша служба приложений Azure не может получить доступ к URL-адресу, на котором размещен ваш локальный API. Предполагая, что сервер, на котором размещен API, отвечает на пакеты ICMP (пинги), я бы попробовал следующее:

  1. Проверка URL-адреса с вашего локального компьютера для разработки — это можно сделать через командную строку/терминал ping <url-here>.
  2. В Azure получить доступ к интерфейсу KUDU — перейдите к App Service > Development Tools > Advanced tools > Go
  3. В одном из выпадающих меню (инструменты, я думаю) должна быть опция командной строки.
  4. Попытайтесь пропинговать URL-адрес в консоли KUDU.
  5. Если проверка связи не удалась, вам нужно будет настроить маршрут или обновить URL-адрес, который вы используете, чтобы использовать полное доменное имя в соответствии с этот ответ.
  6. Если полное доменное имя не работает, то Гибридные подключения Azure также является потенциальным решением вашей проблемы — доступно видео здесь.

Спасибо Мэтт за ответы. Это помогло мне понять, что URL-адрес недоступен из Azure. Однако в этом случае ваш подход предлагает использовать Azure Hybrid, который будет платной услугой. Есть ли альтернативное решение, которое мы можем обработать из кода?

Sandeep 04.06.2019 12:38

Нет проблем @Сандип. Суть проблемы в том, что ваша конечная точка API не является общедоступной, поэтому добавление кода не решит эту проблему. В основном вам нужна общедоступная запись DNS для вашего API — ваша служба хостинга сможет это предоставить. Прежде чем выставлять свой API в Интернет, вам нужно Защитите его с помощью токенов. Или вы можете добавить белый список IP-адресов в свой API, чтобы получить ips веб-приложения (не рекомендуется).

Matt Stannett 04.06.2019 12:50

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