我有一个连续的Web作业,它监听包含诊断信息的请求。

为了测试连通性,我尝试在我的Web作业中进行运行状况检查,但无法根据azure应用服务文档向本地主机发出请求。

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

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

我得到这个异常(exception):
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

该Web作业是通过Kudu(SCM)通过站点扩展安装脚本安装的,这意味着该Web作业最终是Kudu(SCM)的子进程。启动时的Web作业应用程序将自身绑定(bind)到端口8989。在Windows本地启动该应用程序,我可以顺利进行运行状况检查。

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

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

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

最好是可以从网站扩展安装过程中完成,但是任何选择都是不错的选择。

更新2019年12月26日:

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

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

更新04-02-2020:

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

尽管我现在需要管理自己的事件逻辑。

我仍然很想知道是否有可能通过TCP与Web作业进行通信。

最佳答案


否。 WebJob不可能直接通过localhost 将请求发送到站点。
像您提供的那样,此限制记录在sandbox页面上。

有关更多详细信息,您可以引用此SO thread

关于.net - 在Azure App Services应用程序中向本地主机发出请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59471540/

10-10 15:04
查看更多