繁体   English   中英

来自Azure AppService的GET请求返回自身将返回502 Bad Gateway错误

[英]GET Request from an Azure AppService back to itself returns a 502 Bad Gateway error

我有一个Azure AppService /网站,当它收到请求时,服务的一部分包括向自身发出另一个GET请求。 这是HMAC工作流程的一部分。 当我在localhost上运行它时,它运行正常,没有错误。 导致错误的原因与Azure环境有关。 不幸的是,该网站尚未公开。

using (HttpClient httpClient = new HttpClient())
{
   ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

   apiResponse = await httpClient.GetAsync(apiBaseAddress + "api/Survey/GetApiKey/" + appId);
   entity = await apiResponse.Content.ReadAsAsync<ClientApiRegistrationEntity>();
}

传递给GetAsync()的URL是正确的。 URL在Azure中具有https方案; 在本地它只是http。 如果我将URL复制/粘贴到计算机上的浏览器中,则请求将通过。 如果我在Kudu调试控制台上发出请求,则得到502。我已经确认DNS在AppService中能够正确解析。 出于其价值,Kudu中的invoke-webrequest调用返回一个标题为“ 502-Web服务器在充当网关或代理服务器时收到无效响应”的网页。

有任何想法吗? 有什么建议吗?

只是要强调一下,标准/本地Azure Web Apps在称为沙箱的安全环境中运行。 每个应用程序都在其自己的沙箱中运行,从而将其执行与同一台计算机上的其他实例隔离开来,并提供其他程度的安全性和隐私性,否则这些安全性和隐私性将是不可用的。

可以通过Internet访问应用程序的唯一方法是通过已公开的HTTP(80)和HTTPS(443)TCP端口;否则,无法访问Internet。 应用程序可能不会在其他端口上侦听来自Internet的数据包。 但是,应用程序可以创建一个套接字,该套接字可以侦听来自沙箱中的连接。 例如,同一应用程序中的两个进程可以通过TCP套接字相互通信; 从沙箱外部传入的连接尝试(即使它们位于同一台计算机上)将失败。 通过在App Service中使用自定义Windows容器,可以进行应用所需的OS更改,因此可以轻松迁移需要自定义OS和软件配置的本地应用。 请参阅沙箱页面

根据您的要求,您可以签出这些文档以开始:

在Azure App Service中运行自定义Linux容器并在Azure中 运行自定义Windows容器(预览)

502错误的网关错误在前端服务器返回的IIS日志中将不可见,这会将请求转发给托管应用程序的工作程序,并且前端可以返回此错误有很多原因,但通常是502错误是由应用程序级别的问题引起的,其中包括:

•请求时间长

•使用高内存/ CPU的应用程序

•应用程序由于异常而崩溃

您可能始终会按照文档“排除502网关错误的HTTP错误”和“ 503服务不可用”( https://docs.microsoft.com/zh-cn/azure/app-service/troubleshoot-http-502-http-503 )中的“)来识别问题。

我偶然发现了此修复程序。 我在比较开发人员和生产人员之间的应用程序网关时,发现端口4096上有一个名为“ DenyAllInbound”的入站端口规则。我将其拔出,一切又开始正常工作。 我不确定该规则最初是如何实现的。 看起来502是来自Azure的通用“某事不对劲”消息。

FWIW,我通过使用“监视应用程序网关”下的“连接疑难解答”链接找到了“ DenyAllInbound”规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM