在 Azure 应用服务应用程序中向本地主机发出请求

col*_*ins 8 .net http azure azure-app-service-envrmnt azure-web-app-service

我有一个连续的网络作业,用于侦听包含诊断信息的请求。

为了测试连接性,我尝试在我的 Web 作业中进行健康检查,但无法根据 azure 应用服务文档向 localhost 发出请求。

下面的代码是我用来验证我可以从我部署的应用程序连接的代码:

    var uri = new Uri("http://localhost:8989/ping");
    var response = await client.GetAsync(uri);
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

System.Net.Http.HttpRequestException: An error occurred while sending the request. 
---> System.Net.WebException: Unable to connect to the remote server 
---> System.Net.Sockets.SocketException: An attempt was made to access a socket in a way forbidden by its access permissions 127.0.0.1:8989
Run Code Online (Sandbox Code Playgroud)

Web 作业是通过 Kudu (SCM) 通过站点扩展安装脚本安装的,这意味着 Web 作业最终是 Kudu (SCM) 的子进程。启动时的 Web 作业应用程序将自身绑定到端口 8989。在 Windows 上本地启动应用程序,我可以毫无问题地进行健康检查。

azure 应用服务文档说,除非同一沙箱中的应用程序绑定到端口,否则对 localhost 的请求将失败(https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#local-address-请求)。

azure 应用服务文档指出 Kudu 与主应用程序在同一个沙箱中运行 ( https://github.com/projectkudu/kudu/wiki/Kudu-architecture#security-model )。

如何通过 http 启用与我的网络作业的通信?

最好是我可以从站点扩展安装过程中做一些事情,但任何选项都很好。

2019 年 12 月 26 日更新:

我试图强制 SCM 和主应用程序在同一个沙箱中运行WEBSITE_DISABLE_SCM_SEPARATION=truehttps://github.com/projectkudu/kudu/wiki/Configurable-settings#use-the-same-process-for-the-user-站点和 scm 站点)。

文档指出它们已经在同一个沙箱中运行,并且如果一个进程在同一个沙箱中的端口上侦听,那么这些请求应该可以工作。值得注意的是,实际的 SCM w3wp.exe 进程已经能够通过 http 访问 localhost 以用于我的 Web 作业。不过,这种设置似乎并没有改善这种情况。

2020 年 4 月 2 日更新:

我正式放弃了使用 Web 作业的想法,现在我作为主应用程序实例的子进程开始该过程。这使我可以毫无问题地进行交流localhost:8989

虽然我现在需要管理自己的保持活动逻辑。

如果可能的话,我仍然很想知道是否有办法通过 TCP 与网络作业进行通信。

Joe*_*Cai 0

如何通过 http 与我的 Web 作业进行通信?

不可以。WebJob 不可能通过 localhost 直接向站点发送请求。此限制记录在您提供的沙箱页面上。

尝试连接到本地地址(例如 localhost、127.0.0.1)和计算机自己的 IP 将失败,除非同一沙箱中的另一个进程已在目标端口上创建了侦听套接字。

被拒绝的连接尝试(例如以下尝试从 .NET 连接到 127.0.0.1:80 的示例)将导致上述异常。

有关更多详细信息,您可以参考此SO 线程