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


    当我们调用第三方的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方法,来做一个简单的试验。

            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

  • 相关阅读:
    开放平台架构指南
    绝了!起个好标题的9大技巧
    ASP已老,尚能饭否?
    离职,问题就解决了吗?
    什么是草台班子?
    回忆我的第一个软件项目
    Vue3中的Composables组合式函数,Vue3实现minxins
    Vue3中的teleport节点传送
    js中if逻辑过多,常见review优化
    QT安装
  • 原文地址:https://www.cnblogs.com/darrenji/p/4438473.html
Copyright © 2020-2023  润新知