对于 docker 容器内的 POST 方法,System.Net.Http.HttpClient.SendAsync(request) 在 30 秒后停止

问题描述 投票:0回答:1

这是一个简单的问题,但目前我还没有答案。 我尝试从基本控制台应用程序向我的 API 发出请求,但该请求需要 30 秒以上才能完成。有趣的是,当我在 Windows 环境中执行该应用程序时,一切正常。但是,当我使用 Docker Desktop 在容器内运行它时,POST 请求始终在 30 秒后停止。我怀疑我的 Docker 设置中可能存在超时配置问题。即使在 OpenShift 中部署应用程序,此行为仍然存在。任何见解或建议将不胜感激。

这是代码:

var client = new HttpClient();

var request = new HttpRequestMessage(HttpMethod.Post, {URL});

var content = new StringContent({requestBody}, null, "application/json");
request.Content = content;

var response = await client.SendAsync(request); // it crashes here 

HttpRequestException:

# {System.Net.Http.HttpRequestException: An error occurred while sending the request. System.IO.IOException: The response ended prematurely. at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) End of inner exception stack trace --- at System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.DecompressionHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken) at RestSharp.RestClient.ExecuteRequestAsync(RestRequest request, CancellationToken cancellationToken)}

我尝试更改一些 docker 设置以增加超时并确保这不是代理问题:-)

c# docker containers
1个回答
0
投票

问题似乎可能与 .NET 中 HttpClient 类的默认超时设置有关,而不是与 Docker 设置有关。默认情况下,HttpClient 类对于整个请求和读取响应流的超时均为

100 seconds

要增加 HttpClient 请求的超时时间,您可以设置 HttpClient 实例的 Timeout 属性

var client = new HttpClient();
client.Timeout = TimeSpan.FromMinutes(5); // Set timeout to 5 minutes (adjust as needed)

此外,您还可以考虑配置 Docker 以增加其与网络相关的超时,但由于问题与应用程序中的 HttpClient 有关,因此调整代码中的超时就足够了

参考:https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout?view=net-8.0

© www.soinside.com 2019 - 2024. All rights reserved.