C# 正在尝试查找我的PostAsync(URL,BODY)的原因。结果将超时,但仅在.NET4.6中
我正试图通过对RESTAPI的POST请求创建一个Docker容器 在.NETCore2.0中,以下代码起作用C# 正在尝试查找我的PostAsync(URL,BODY)的原因。结果将超时,但仅在.NET4.6中,c#,.net,docker,httpclient,C#,.net,Docker,Httpclient,我正试图通过对RESTAPI的POST请求创建一个Docker容器 在.NETCore2.0中,以下代码起作用 using System; using System.Net.Http; using System.Text; namespace DockerDebug { class Program { static void Main(string[] args) { string reply = string.Empty
using System;
using System.Net.Http;
using System.Text;
namespace DockerDebug
{
class Program
{
static void Main(string[] args)
{
string reply = string.Empty;
try
{
using (HttpClient dockerClient = new HttpClient())
{
StringContent httpContent = new StringContent("{\"Image\":\"busybox\"}", Encoding.UTF8, "application/json");
HttpResponseMessage dockerRepsponse = dockerClient .PostAsync("http://localhost:2375/v1.29/containers/create?name=bussybox", httpContent).Result;
reply = dockerRepsponse.Content.ReadAsStringAsync().Result;
}
}
catch (Exception ex)
{
reply = ex.Message;
}
Console.WriteLine(reply);
}
}
}
我的Docker环境在tcp://localhost:2357 没有打开TLS
我可以使用Chrome的restapi插件或POSTMAN在REST调用中运行上述命令
上述代码也适用于.NETCore2.0
但是,在构建.NET 4.5和4.6.1时,每次PostAsync调用时,它都会超时。我要做的第一件事是删除
。结果
您在任何地方都在强制将异步任务放回同步返回。这是不好的,可能会引入锁以及其他问题
相反,将其转换为true async并允许控制台等待的简单修复程序如下所示:
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var tcs = new TaskCompletionSource<bool>();
string reply = string.Empty;
Task.Run(async () =>
{
try
{
using (var httpClient = new HttpClient())
{
var httpContent = new StringContent("{\"Image\":\"busybox\"}", Encoding.UTF8, "application/json");
var result = await httpClient.PostAsync("http://localhost:2375/v1.29/containers/create?name=bussybox", httpContent);
reply = await result.Content.ReadAsStringAsync();
}
}
catch (Exception ex)
{
reply = ex.Message;
tcs.TrySetResult(false);
}
});
tcs.Task.Wait();
Console.WriteLine(reply);
}
}
}
将超时设置为10分钟
在这两件事之间,我认为你不应该有问题。4.6.1的超时需要多长时间?在.NET Core 2.0上成功需要多长时间?4.6.1超时在1分钟40秒后抛出2.0在大约1秒内执行注意:两个版本实际上都调用Docker并创建容器,只有4.6.1不会完成,所以我可以得到结果。
reply
的值是多少?Valid={“Id”:“b0336923e3013bffa18661cc2b915479615e33f8ed2576f159f63bb48272b1c2”,“警告”:null}超时=发生一个或多个错误。异常堆栈跟踪为“在System.Threading.Tasks.Task.ThrowifeException(布尔includeTaskCanceledExceptions)\r\n在System.Threading.Tasks.Tasks.Tasks1.GetResultCore(布尔waitCompletionNotification)\r\n在C:\\Users\\user\\source\\repos\\DockerDebug\\DockerDebug\\Program.cs中的System.Threading.Tasks.Task
1.get\u Result()\r\n在DockerDebug.Program.Main(字符串[]args)处,使用C:\\Users\\user\\source\\repos\\DockerDebug\\DockerDebug\\Program.cs:line 18“我已经尝试了带和不带.ConfigureAwait的异步等待(false)超时错误仍然存在,因此我从未收到有效回复。函数本身正在运行(容器在两个版本中都已创建),并且只是运行您的代码进行验证。相同的错误“任务已取消”。:(1分钟40秒后。据我所知,只有两件事会触发任务被取消:1.您明确取消了它(您的代码没有这样做),或者2.http调用超时…这表明超时设置不正确,或者在错误的位置,或者.Net Framework不遵守这一点。您是否逐字复制了我的代码?您还可以通过在catch语句中执行以下操作来检查是否超时:var wasteimeout=!(例如作为TaskCanceledException)?.CancellationToken.IsCancellationRequested
。注意我更新了示例代码如何正确设置timeoutyes,并仅以10分钟超时运行,现在花了10分钟,但仍然存在相同的超时错误。httpClient.timeout=new System.TimeSpan(0,10,0);
httpClient.Timeout = TimeSpan.FromMinutes(10);