我有一个持续的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=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。然而,这个设置似乎并没有改善情况。
更新于2020年04月02日:
我正式放弃了使用Web作业的想法,现在我将进程作为主应用程序实例的子进程启动。这允许我与localhost:8989
进行通信,没有任何问题。
虽然现在我需要管理自己的保持活动逻辑。
我仍然想知道是否有办法通过TCP与Web作业进行通信,如果可能的话。
WebJobs
运行在IHost
容器内部,因此套接字连接未启用。更多细节请参见我的答案。 - Igwe Kalu