免责声明:
这是陈词滥调,但它适用于我的机器(!)
上下文:
使用“免费套餐”选项在 Windows 上运行的 Http 触发 Azure 函数应用程序。
详情:
我有一个 Azure 函数应用程序,它托管并运行一个 JAR 文件,该文件启动一个 Grizzly 服务器,该服务器基本上为托管在 localhost:8080 中的 JAVA 应用程序提供服务。函数应用程序只需使用即可启动 JAVA 应用程序。JAVA 应用程序称为 Open Trip Planner,它在 Grizzly 服务器中运行。
Process.Start(javaPath, "<<JAR OPTIONS HERE>>");
- 到目前为止,它在我的机器和 Azure 中都可以使用。
然后我运行一个单独的线程来检查应用程序是否已启动:
while (true)
{
Thread.Sleep(10000);
try
{
var result = await client.GetAsync("http://localhost:8080");
// <-- The above fails in Azure but not in my local machine.
}
catch (Exception ex)
{
log.LogError(ex.Message);
}
}
例外是:““试图以访问权限禁止的方式访问套接字”</p>
异常详情:
异常类型:
System.Net.Http.HttpRequestException
信息
试图以访问权限禁止的方式访问套接字
堆栈跟踪
在 System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32 端口,CancellationToken 取消令牌)在 System.Threading.Tasks.ValueTask
1.get_Result() at System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancellationToken) at System.Threading.Tasks.ValueTask
1.get_Result() 在 System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask1 creationTask) at System.Threading.Tasks.ValueTask
1.get_Result()
在 System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage 请求,布尔 doRequestAuth,CancellationToken 取消令牌)
在 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, CancellationToken cancelToken) 在 System.Net.Http.DiagnosticsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancelToken) 在 System.Net.Http.HttpClient.FinishSendAsyncBuffered(Task`1 sendTask, HttpRequestMessage 请求,CancellationTokenSource cts,布尔 disposeCts) 在 ScoreAddressFunction.ScoreAddress.<>c__DisplayClass3_0.<b__0>d.MoveNext() 在 /home/vsts/work/1/s/ScoreAddressFunction/ScoreAddressFunction/ScoreAddress.cs:line 85
但是,如果我将 URL 更改为“ https://www.google.com ”之类的东西,它会起作用,这让我认为这不是由其他答案中可用套接字数量有限引起的。
问题:
尝试从 Azure Function App 内部访问 localhost(或 127.0.0.1)是否有问题?我是否缺少一些技术/安全限制?
我担心的一个问题是我从错误的概念角度来面对这个问题。但是,我运行的进程需要大量内存,并且在我需要的时候让它在 Azure Function App 上运行会很棒,否则会非常昂贵。