我正在开发一个在码头容器中运行的.NET API。在某个时候,它调用也在容器中运行的Python。
var response = await httpClient.GetAsync("http://service-name:8000/actual/url")然后产生以下错误:
System.Net.Http.HttpRequestException: Resource temporarily unavailable
---> System.Net.Sockets.SocketException (11): Resource temporarily unavailable
at System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken
cancellationToken)以前有没有人有过这方面的经验,并且有可能知道解决方案?我在网上找不到很多关于它的东西。我见过一些提到这个问题的地方,可能与Flask没有使用异步方法有关,但这对我来说是没有意义的。
当使用localhost:8000/actual/url通过web浏览器或邮递员访问时,Flask生成适当的响应,容器记录这些响应。我尝试过在.NET API中使用localhost URL,但这也不起作用。
如果需要更多的信息,请留下评论,我会尽我所能尽快更新这篇文章。
-克里斯蒂
发布于 2022-06-19 16:46:05
TLDR
出现“资源暂时不可用”错误的原因之一是DNS服务器在名称解析期间使用RCODE 2(服务器故障)进行响应。
长答案
我注意到在dotnet运行时高寒码头容器中运行的dotnet应用程序中也存在相同的行为。以下是我的调查结果:
错误消息“资源暂时不可用”对应于由C标准库中的各种函数返回的EAGAIN错误代码。起初,我怀疑connect()函数,因为C#堆栈跟踪指示在c#套接字的ConnectAsync()调用期间发生的错误。实际上,EAGAIN错误代码出现在connect()的手册页中,说明如下:“不再有空闲的本地端口或路由缓存中没有足够的条目”。
我模拟了一个使用耗尽本地端口的系统,并注意到在这种情况下会抛出一个不同的异常,这就排除了本地端口可用性是原始异常的根本原因。关于手册页中提到的另一个原因,结果是路由缓存在2012年从Linux中被删除。提交
我开始在musl源代码中查找EAGAIN,该库用于dotnet运行时高寒码头容器中。过了一会儿,我终于注意到了R函数,它用于通过DNS将域名解析为ip地址。在System.Net.Sockets.Socket.ConnectAsync()期间,主机名仍然是字符串,使用gethostbyname2_r函数(或其变体之一)在本机代码中解析名称。
最后一个问题是: gethostbyname2_r何时返回EAGAIN错误代码?当DNS响应头中的RCODE字段的值为2时,它表示“服务器失败”。源项目166
为了验证这个结果,我运行了一个简单的模拟DNS服务器,它总是在DNS响应中返回RCODE 2。结果的c#异常以及堆栈跟踪与原始异常完全匹配。
https://stackoverflow.com/questions/68866356
复制相似问题