当我们调用第三方的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;
            }
        }

延迟调用或多次调用第三方的Web API服务的更多相关文章

  1. web api 初体验 解决js调用跨域问题

    跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user     http:IP:8002/api/user 不同IP不同端口: http://172.28.20.100:8 ...

  2. 用Ajax调用web api,解决URL太长的问题;

    本来是用的WCF,但是服务需要多种方式调用(后台+前端Ajax),最终局面就是我在WCF每个服务中都判断一下↓ #region 解决接收不到Ajax中传来的参数... if (jsonParames ...

  3. web api 跨域请求,ajax跨域调用webapi

    1.跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服 ...

  4. Xamarin.Android 调用Web Api(通过ListView展示远程获取的数据)

    xamarin.android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问.xamarin.android调用远程数据主要有两种方式: 在Android中保存数据或调用数 ...

  5. WebService学习总结(四)——调用第三方提供的webService服务

    http://www.cnblogs.com/xdp-gacl/p/4260627.html 互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他 ...

  6. WebService学习--(四)调用第三方提供的webService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...

  7. WebService学习总结——调用第三方提供的webService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据. 气象中心的管理系统将收 ...

  8. WebService学习总结(三)--调用第三方提供的webService服务

    互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取电子邮箱验证和查询火车时刻表和天气预报 ...

  9. ASP.NET Web API与Owin OAuth:调用与用户相关的Web API

    在前一篇博文中,我们通过以 OAuth 的 Client Credential Grant 授权方式(只验证调用客户端,不验证登录用户)拿到的 Access Token ,成功调用了与用户无关的 We ...

随机推荐

  1. Spring面试问答25题

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  2. C#使用WSDL服务总结

    站在巨人肩上才能看的更远! 1.C# 利用VS自带的WSDL工具生成WebService服务类 2.C#使用WSDL服务

  3. Android Studio之代码提示快捷键冲突设置

    1.原代码提示快捷键为:Ctrl+空格,与Windows输入法冲突,所以将代码提示快捷键设置为:Ctrl+反斜杠.

  4. C#: +(特性 ) + Attitude C#(类)前面或者(方法)前面 (中括号)定义

    首先要说的是,可能一些刚接触C#的朋友常常容易把属性(Property)跟特性(Attribute)弄混淆,其实这是两种不同的东西.属性就是面向对象思想里所说的封装在类里面的数据字段,其形式为: 1: ...

  5. 抓包获取百度音乐API

    这次抓包是获取手机APP中的数据包,共分为三个部分: 1.win7建立wifi 2.PC架设代理服务器 手机设置代理 3.抓包分析 一.win7建立wifi 在win7下搭建wifi非常简单,网上的教 ...

  6. Flask 目录

    flask入门 flask 源码剖析 Flask session Flask form

  7. Selenium Books

    Recently, some of my projects rely heavily upon tests with selenium. Some books about selenium are c ...

  8. smali 语言语法

    Androidkiller 可以反编译Android的apk,生成一种.smali代码.(这理解好像不对) 网上找了一篇smali的语法手册,可以方便查找,文章名<Smali文件语法参考> ...

  9. 高能天气——团队Scrum冲刺阶段-Day 5

    高能天气--团队Scrum冲刺阶段-Day 5 今日完成任务 于欣月:基本实现计步器功能:现阶段实现了每天进行步数统计并显示,计划实现历史步数统计和设置锻炼计划功能,并实现可视化图形界面 余坤澎:实现 ...

  10. RegExp.$1

    在学习vue2的compile的模板解析的时候,会出现这个正则表达式,不是很清楚,所有就弄明白下并记录下来. RegExp 是javascript中的一个内置对象.为正则表达式.RegExp.$1是R ...