Я не могу выполнять вызовы локального 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 Premise API недоступен за пределами сети организации. Какие настройки необходимо выполнить, чтобы Azure могла получить доступ к локальному API?
Привет @Sandeep, вам нужно обратиться в свой ИТ-отдел, чтобы узнать, как предоставить ваш API для Azure. Конечно, у вас есть сервер, на котором размещен API, им потребуется выполнить некоторые настройки на уровне брандмауэра и маршрутизации, чтобы внешний запрос мог достигать вашего внутреннего сервера. В крайних случаях и для тестирования вы всегда можете попробовать использовать ngrok.com для разработки/тестирования. Я бы не рекомендовал использовать его в прямом эфире.
На мой взгляд, сообщение об ошибке выглядит достаточно прямолинейно: ваша служба приложений Azure не может получить доступ к URL-адресу, на котором размещен ваш локальный API. Предполагая, что сервер, на котором размещен API, отвечает на пакеты ICMP (пинги), я бы попробовал следующее:
ping <url-here>
.App Service > Development Tools > Advanced tools > Go
Спасибо Мэтт за ответы. Это помогло мне понять, что URL-адрес недоступен из Azure. Однако в этом случае ваш подход предлагает использовать Azure Hybrid, который будет платной услугой. Есть ли альтернативное решение, которое мы можем обработать из кода?
Нет проблем @Сандип. Суть проблемы в том, что ваша конечная точка API не является общедоступной, поэтому добавление кода не решит эту проблему. В основном вам нужна общедоступная запись DNS для вашего API — ваша служба хостинга сможет это предоставить. Прежде чем выставлять свой API в Интернет, вам нужно Защитите его с помощью токенов. Или вы можете добавить белый список IP-адресов в свой API, чтобы получить ips веб-приложения (не рекомендуется).
Вы пытались открыть свой On Permise API из-за пределов вашей текущей сети? Например, используя 3G с вашего телефона? Если вы находитесь в корпоративной сети, если кто-то не изменит конфигурацию сети, чтобы разрешить входящие подключения, Azure не сможет получить доступ к вашему API On Permise.