我有一个azureappservice/网站,当它收到一个请求时,服务的一部分包括向自己发出另一个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服务器在充当网关或代理服务器时收到无效响应”的网页。
有什么想法吗?建议?
2条答案
按热度按时间vatpfxk51#
我偶然发现了这个补丁。我在比较dev和prod之间的应用程序网关时,注意到端口4096上有一个名为“denyallinbound”的入站端口规则。我把它拔出来,一切又开始运转了。我不知道这条规则一开始是怎么来的。看起来502是来自azure的一个通用的“有点不对劲”消息。
fwiw,我通过使用应用程序网关监视下的“连接疑难解答”链接找到了“denyallinbound”规则。
t2a7ltrp2#
值得一提的是,标准/本机azureweb应用程序运行在一个称为沙盒的安全环境中。每个应用程序都在自己的沙盒中运行,将其执行与同一台机器上的其他示例隔离开来,并提供了额外的安全性和隐私性,否则就不可用了。
通过internet访问应用程序的唯一方法是通过已经公开的http(80)和https(443)tcp端口;应用程序可能不会在其他端口上侦听来自internet的数据包。但是,应用程序可以创建一个套接字,用于侦听沙盒中的连接。例如,同一应用中的两个进程可以通过tcp套接字彼此通信;从沙盒外部传入的连接尝试(尽管它们在同一台计算机上)将失败。通过在应用程序服务中使用自定义windows容器,您可以根据应用程序的需要更改操作系统,因此很容易迁移需要自定义操作系统和软件配置的本地应用程序。请参阅沙盒页面。
根据您的要求,您可以 checkout 这些文档以开始:
在azure应用程序服务中运行自定义linux容器&在azure中运行自定义windows容器(预览)
502个坏网关错误在iis日志中不可见,因为它们是由前端服务器返回的,它将请求转发给承载应用程序的工作进程,前端可以返回此错误的原因有很多,但通常,502个错误是由应用程序级问题引起的,其中:
•需要很长时间的请求
•使用高内存/cpu的应用程序
•应用程序因异常而崩溃
您可以始终按照文档“502坏网关”和“503服务不可用”来解决http错误(https://docs.microsoft.com/en-us/azure/app-service/troubleshoot-http-502-http-503)“用于识别问题的azure应用程序服务中。