zoukankan      html  css  js  c++  java
  • Lind.DDD.Utils.HttpHelper里静态对象引出的Http超时问题

    回到目录

    Lind.DDD.Utils.HttpHelper组件主要实现了对HTTP的各种操作,如Get,Post,Put和Delete,它属于最纯粹的操作,大叔把它封装的目的主要为了实现与API安全授权的统一,你不可能为每个请求都写一个“逻辑完全一样的加密规则”,这是违背DRY原则的,我们应该通过面向对象的各位原则,将这种可变的部分封装!

    公开的统一方法

    真正的对象转键/值对

    支持对复杂类型,集合类型转为Dictionary的键值对,它并不是网上说的,只把一层属性进行拼接,而是大叔利用递归写了一个算法,琢层查找对象。

          /// <summary>
            /// 将对象转为键值对象(完全支持最复杂的类型)
            /// 作者:仓储大叔
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static IDictionary<string, string> ToDictionary(this object obj)
            {
                try
                {
                    var dic = new Dictionary<string, string>();
                    var prefix = new Dictionary<string, string>();
                    foreach (var p in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
                    {
                        ReGenerate(obj, p, prefix, dic, null);
                        prefix.Clear();
                    }
                    return dic;
                }
                catch (Exception)
                {
    
                    throw;
                }
    
            }

    其中ReGenerate核心方法被封装到了Lind.DDD.Utils.HttpHelper组件里

    静态对象引起的超时

    对于Http方法来说,我们可以定义它的handler,添加一些压缩,代理,身份验证等信息,但在组件设计时一定要注意,当你定义了handler之后,如果又显示的设计了超时时间,千万不要将handler做成全局静态属性,因为这样会让你的第一次请求后的其它请求都超时,因为你的超时时间依赖你全局的handler,正确的做法,应该在每个方法里(get,post,put,delete)定义自已的handler,类似这样的代码是正确的。

            public static HttpResponseMessage Get(string requestUri, NameValueCollection nv = null, int timeOut = 10)
            {
                var handler = new HttpClientHandler() { AutomaticDecompression = System.Net.DecompressionMethods.GZip };
                using (var http = new HttpClient(handler))
                {    //超时
                    http.Timeout = new TimeSpan(0, 0, timeOut);
                    HttpResponseMessage response;
                    try
                    {
                        response = http.GetAsync(GeneratorUri(requestUri, ApiValidateHelper.GenerateCipherText(nv))).Result;
                    }
                    catch (Exception ex)
                    {
                        response = new HttpResponseMessage(System.Net.HttpStatusCode.RequestTimeout) { Content = new StringContent("请求超时") };
                        Logger.LoggerFactory.Instance.Logger_Error(ex);
                    }
    
                    return response;
                }
            }

    对于一种知识,一个概念的理解程度,有时决定了组件设计的正确性与安全性!

    让我们一起对技术做更深入,更直接的研究吧!

    回到目录

  • 相关阅读:
    规划支持系统的现状与发展方向
    环境影响评价的概念和指标体系
    DTD to XSD的在线免费转换工具
    如何在64位IIS中启用32位支持
    Entity Framework 1.0中的日期比较
    安装Office 2010 beta后Visual Studio 2008的Web设计器失去响应的问题
    为何由WSDL.exe生成的Web服务代理类无法正确的序列化枚举类型?因为……
    如何为一个XML文件进行DTD验证
    释放VB.NET下Linq to XML的智能提示的威力
    Entity Framework概述 For 终结者
  • 原文地址:https://www.cnblogs.com/lori/p/5833259.html
Copyright © 2011-2022 走看看