延迟调用或多次调用第三方的Web API服务_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 延迟调用或多次调用第三方的Web API服务

延迟调用或多次调用第三方的Web API服务

 2015/4/19 11:26:57  Darren Ji  程序员俱乐部  我要评论(0)
  • 摘要:当我们调用第三方的WebAPI服务的时候,不一定每次都是成功的。这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务。Task的静态方法Delay允许我们延迟执行某个Task,此方法可以让我们做到延迟一段时间再去调用服务;多尝试几次调用如何实现呢?可以用循环遍历。在"使用HttpClient对ASP.NETWebAPI服务实现增删改查"中,创建了一个ASP.NETWebAPI项目,本篇沿用此WebAPI服务。在ASP
  • 标签:API Web 服务

当我们调用第三方的Web API服务的时候,不一定每次都是成功的。这时候,我们可能会再多尝试几次,也有可能延迟一段时间再去尝试调用服务。

 

Task的静态方法Delay允许我们延迟执行某个Task,此方法可以让我们做到延迟一段时间再去调用服务;多尝试几次调用如何实现呢?可以用循环遍历。

 

在"使用HttpClient对ASP.NET Web API服务实现增删改查"中,创建了一个ASP.NET Web API项目,本篇沿用此Web API服务。

 

在ASP.NET Web API项目的同一个解决方案下创建一个控制台应用程序。

 

依次点击"工具","库程序包管理器","程序包管理器控制台",输入如下:

 

Install-Package Microsoft.AspNet.WebApi.Client

 

注意:是为新的控制台项目添加包,在"默认项目"选项下要选择刚创建的控制台项目,并且把它设置为启动项目。


首先使用Task的Delay方法,来做一个简单的试验。

 

monospace; width: 100%; margin: 0em; background-color: #f0f0f0">        static void Main(string[] args)
        {
            Task<int> t = Task.Factory.StartNew(() => GetSth(2));
            Console.WriteLine(DelayResult(t.Result, TimeSpan.FromSeconds(5)).Result);
            Console.ReadKey();
        }
        static async Task<T> DelayResult<T>(T result, TimeSpan delay)
        {
            await Task.Delay(delay);
            return result;
        }
        static int GetSth(int a)
        {
            return a;
        }

 

结果发现,的确是延迟调用了Task,显示结果的时候有延迟。

 

然后使用HttpClient来调用Web API服务,写2个方法,一个方法尝试4次,一秒钟后重试,然后2秒钟后重试,再然后4秒钟后重试,最后再尝试一次;另外一个方法尝试2次,尝试一次后,再隔一段时间尝试。

 

       static void Main(string[] args)
        {
            Console.WriteLine(DownloadStringWithRetries("/api/Product/1").Result);
            Console.WriteLine(DownloadStringWithTimeout("/api/Product/1").Result);
            Console.ReadKey();
        }
        //尝试4次,一秒钟后重试,然后2秒钟后重试,再然后4秒钟后重试,最后尝试一次
        static async Task<string> DownloadStringWithRetries(string uri)
        {
           
            using (var client = new HttpClient())
            {
                //设置
                client.BaseAddress = new Uri("http://localhost:1310/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                //一秒钟后重试,然后2秒钟后重试,再然后4秒钟后重试
                var nextDelay = TimeSpan.FromSeconds(1);
                for (int i = 0; i != 3; ++i)
                {
                    try
                    {
                        return await client.GetStringAsync(uri);
                    }
                    catch 
                    {
                    }
                    await Task.Delay(nextDelay);
                    nextDelay = nextDelay + nextDelay;
                }
                //最后再试一次
                return await client.GetStringAsync(uri);
            }
        }
        //尝试2次,尝试一次后,再隔一段时间尝试
        static async Task<string> DownloadStringWithTimeout(string uri)
        {
            using (var client = new HttpClient())
            {
                //设置
                client.BaseAddress = new Uri("http://localhost:1310/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                var downloadTask = client.GetStringAsync(uri);
                var timeoutTask = Task.Delay(3000);
                //如果Web API服务没有在3秒响应,就返回null
                var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
                if (completedTask == timeoutTask)
                {
                    return null;
                }
                return await downloadTask;
            }
        }

 

1

发表评论
用户名: 匿名