WebClient 需要 43 秒才能下载此 json 字符串 https://jsonplaceholder.typicode.com/posts

WebClient taking 43 seconds to download this json string https://jsonplaceholder.typicode.com/posts

12 小时前(大约在德克萨斯州的晚餐时间),当我希望由于高流量导致延迟非常高时,它工作正常。

知道为什么会发生这种情况以及如何解决这个问题吗?

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Nancy.Json;

namespace Training.Threading
{
    class TasksDemo
    {
        static async Task Main(string[] args)
        {
            Post[] posts = await GetPostsAsync();

            foreach(Post post in posts)
                System.Console.WriteLine(post.Title);
        }

        public static Task<Post[]> GetPostsAsync() => Task.Run(() =>
         {
             var json = new WebClient().DownloadString("https://jsonplaceholder.typicode.com/posts");
             JavaScriptSerializer ser = new JavaScriptSerializer();
             var posts = ser.Deserialize<Post[]>(json);
             return posts;
         });
    }
    public class Post
    {
        public int UserId { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }
}

我认为代码不是这里的问题。更重要的是您的 ISP 或您尝试联系的服务器/流量可用的带宽。

一些工具可以帮助您专门诊断 windows 中的问题以发现您的问题,包括

  • 'tracert'(追踪路线)
  • 'ping'(平)

在Windows中:

ping jasonplaceholder.typicode.com 

查看 "hops"

之间的延迟
tracert jsonplaceholder.typicode.com

假设服务器响应 ping 请求 ICMP,这将以毫秒为单位提供您尝试访问的服务器的延迟。

根据我现在使用的 HttpClient 的 @maccettura 和 @ckuri 的建议,我认为我会很好 post 这里的代码。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Nancy.Json;

namespace Training.Threading
{
    class TasksDemo
    {
        static async Task Main(string[] args)
        {
            string json = await GetPostsAsync();
            // System.Console.WriteLine(json);
            JavaScriptSerializer ser = new JavaScriptSerializer();
            var posts = ser.Deserialize<Post[]>(json);

            foreach(Post post in posts)
                System.Console.WriteLine(post.Title);
        }

        public static async Task<string> GetPostsAsync()
        {
            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(@"https://jsonplaceholder.typicode.com");
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                return await client.GetStringAsync("/posts");
            }
        }
    }
    public class Post
    {
        public int UserId { get; set; }
        public string Title { get; set; }
        public string Body { get; set; }
    }
}