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

8
我是一名有用的助手,可以为您翻译文本。

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

为了测试连接性,我尝试访问我的Web作业中的健康检查,但根据Azure应用程序服务文档,无法对localhost进行请求。

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

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

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

网站作业是通过Kudu(SCM)的站点扩展安装脚本安装的,这意味着网站作业最终是Kudu(SCM)的子进程。启动时,网站作业应用程序将自己绑定到端口8989。在Windows本地启动应用程序后,我能够轻松访问我的健康检查。
Azure应用服务文档表示,除非同一沙箱内的应用程序绑定到该端口,否则对localhost的请求将失败(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与我的网站作业进行通信?
最好是我可以从站点扩展安装过程中完成,但任何选项都可以。

更新于2019年12月26日:

我尝试使用WEBSITE_DISABLE_SCM_SEPARATION=truehttps://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。然而,这个设置似乎并没有改善情况。

更新于2020年04月02日:

我正式放弃了使用Web作业的想法,现在我将进程作为主应用程序实例的子进程启动。这允许我与localhost:8989进行通信,没有任何问题。

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

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


这是我找到的最相似的问题:https://stackoverflow.com/questions/56572039/an-attempt-was-made-to-access-a-socket-in-a-way-forbidden-by-its-access-permiss - colin-higgins
访问问题可能源于对Kudu的身份验证/授权。请分享客户端实例创建的详细信息。 - Igwe Kalu
这是在请求离开应用程序上下文之前的情况。 - colin-higgins
1
就像我在答案中建议的那样,由于WebJobs运行在IHost容器内部,因此套接字连接未启用。更多细节请参见我的答案。 - Igwe Kalu
1
GitHub上的维基文档并不总是最新的,官方文档也不例外。我怀疑这是否应该正常工作... - Sean Feldman
3个回答

0

在WebJob中实现HTTP服务器是不合适的,因为它们不是用于此目的的。

WebJob基本上是在IHost容器内执行的,该容器专为无头服务而设计,可以支持后台处理任务。与IWebHost不同,IHost不适合Web托管。

因此,您创建的WebJob可能没有有效地绑定到您提到的端口。如果确实绑定了,很可能沙盒的安全策略会限制对由其他用户创建的任意套接字的访问权限,除非这些套接字已公开用于访问您的站点和kudu服务。您分享的错误堆栈跟踪片段中正是通过"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"来指示的。

如何通过http启用与我的WebJob的通信? - 可以通过WebJobs API建立与WebJob的通信。
您可能需要创建多个 WebJobs,以实现您尝试的HTTP服务器实现所需的各种功能。
参考资料

0
如何通过http启用与我的Web作业的通信?
不。 WebJob无法直接通过localhost向站点发送请求。 这个限制在您提供的sandbox页面上有记录。
尝试连接本地地址(例如localhost、127.0.0.1)和机器自己的IP将失败,除非同一沙盒中的另一个进程已在目标端口上创建了侦听套接字。
被拒绝的连接尝试,例如以下示例尝试从.NET连接到127.0.0.1:80,将导致上述异常。
更多详情,请参考SO thread

你说网络作业不能向该网站发送请求,但我想要相反的方向。此外,“除非同一沙盒中的另一个进程已在目标端口上创建了侦听套接字”让我相信这是可能的。 - colin-higgins

0

我相信问题与分配给您的应用程序端口(8989)有关。您需要使用另一个服务(旧版云服务)、虚拟机或 Service Fabric,以便在端口 8989 上打开并接收请求。

更多信息:

网络端点监听

通过已公开的 HTTP (80) 和 HTTPS (443) TCP 端口是访问应用程序的唯一方式;应用程序不能监听其他端口以接收从 Internet 到达的数据包。但是,应用程序可以创建一个套接字,以便在沙盒内部监听连接。例如,同一应用程序内的两个进程可以通过 TCP 套接字互相通信;来自沙盒外部的连接尝试,即使它们在同一台机器上,也将失败。有关详细信息,请参见下一个主题。

https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox


如果我动态选择了一个空闲端口,它也无法工作。 - colin-higgins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接