Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在尝试查找我的PostAsync(URL,BODY)的原因。结果将超时,但仅在.NET4.6中_C#_.net_Docker_Httpclient - Fatal编程技术网

C# 正在尝试查找我的PostAsync(URL,BODY)的原因。结果将超时,但仅在.NET4.6中

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

我正试图通过对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;
            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.Tasks
1.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);