Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从Microsoft Bot C调用本地API#_C#_Botframework - Fatal编程技术网

C# 如何从Microsoft Bot C调用本地API#

C# 如何从Microsoft Bot C调用本地API#,c#,botframework,C#,Botframework,一旦部署到Azure上,我就无法从MS Bot(v4)C#进行内部API调用。当使用emulator进行本地测试时,本地API调用工作正常 根据Microsoft支持团队的建议,我已经尝试使用直拨频道进行网络聊天,但没有任何帮助 AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false); HttpWebRequest webRequest = Http

一旦部署到Azure上,我就无法从MS Bot(v4)C#进行内部API调用。当使用emulator进行本地测试时,本地API调用工作正常

根据Microsoft支持团队的建议,我已经尝试使用直拨频道进行网络聊天,但没有任何帮助

                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:捕获异常:发送请求时出错。调用WINHTTP\u CALLBACK\u STATUS\u REQUEST\u Error时出现错误12029,“无法建立与服务器的连接”。

对我来说,错误消息看起来相当直接,您的Azure应用程序服务无法访问本地API所在的URL。假设API所在的服务器响应ICMP数据包(ping),我将尝试以下操作:

  • 从您的本地开发机器-这可以通过命令提示符/terminal
    ping
    完成
  • 在Azure中-转到
    应用程序服务>开发工具>高级工具>转到
  • 在其中一个下拉菜单(我相信是工具)中,应该有一个命令提示选项
  • 尝试在KUDU控制台中ping URL
  • 如果ping失败,则需要根据设置路由或更新用于使用FQDN的URL
  • 如果FQDN不起作用,那么它也是您问题的潜在解决方案-有视频可用

  • 您是否尝试从当前网络外部打开许可证API?例如,从手机使用3G?如果您在公司网络中,除非有人更改网络配置以允许入站连接,否则Azure将无法访问您的On Permise API。感谢您的回复Paulo。组织网络外部无法访问本地API。Azure需要进行哪些配置才能达到内部API?您好@Sandeep,您需要询问您的IT部门,了解如何将您的API公开给Azure。为了确保您拥有承载API的服务器,他们需要在防火墙和路由级别进行一些配置,以允许外部请求到达您的内部服务器。在极端情况下,对于测试,您总是可以尝试将其用于开发/测试。我不建议在现场使用。谢谢马特的回复。这帮助我了解到,该url无法从Azure访问。然而,在这种情况下,您的方法建议使用Azure Hybrid,这将是付费服务。是否有其他解决方案,我们可以从代码中处理?没问题@Sandeep。问题的关键是API端点不可公开访问,因此添加代码无法解决此问题。你的API基本上需要一个公共DNS条目-你的托管服务将能够提供这一点。在您将API公开到internet之前,您需要进行以下操作:。或者,您可以将IP地址白名单添加到API中,以获取您的IP地址(不推荐)。