服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - 完成OSS.Http底层HttpClient重构封装 支持标准库

完成OSS.Http底层HttpClient重构封装 支持标准库

2021-12-24 13:32KevinCC C#

OSS.Http项目对于.Net Standard标准库的支持已经迁移完毕,OSS开源系列两个最底层的类库已经具备跨运行时支持的能力。本篇文章主要包含 1. HttpClient的介绍,2. 重构的思路, 3. 容易遇到的问题。具有很好的参考价值,下面跟着小编一

oss.http项目对于.net standard标准库的支持已经迁移完毕,oss开源系列两个最底层的类库已经具备跨运行时支持的能力。由于oss.http类库是几年前我参照restsharp的思路,完成的一个轻量型http请求框架。因为时间较久底层使用的还是httpwebrequest,这次基本上是完全重构,这篇文章主要包含 1. httpclient的介绍,2. 重构的思路, 3. 容易遇到的问题。

一. httpclient的基本介绍

httpclient应该是在.net framework4.5版本左右引用的新功能,在此之前常用的是httpwebrequest,相比较而言,前者更加的简单清晰,最重要的是完全支持.net standard api,这也是我选择它的重要原因。

httpclient在结构上做了很大的调整,并且是完全异步的实现,可以说从底层上完成了异步的支持,这里先介绍对应的几个主要类:

1.  htttprequestmessage

请求的基本信息,请求地址,请求动作等,此值是在httpclient发起请求的方法中当参数传入,与他对应的是响应 httpresponsemessage

2.  httpcontent

请求的内容体,主要包含请求的具体内容,contenttype,contentlenght等,是htttprequestmessage的一个属性,这两个都包含headers属性,但是范围分别不一样,这个是很容易混淆出错的地方,我给做了简单分类:

httprequestmessage的头部(httprequestheaders )主要是请求的属性,如accept,useragent,acceptencoding等http链接的基本属性。

httpcontent的头部(httpcontentheaders)主要是当前请求内容的属性,主要有:allow,content-encoding,content-length,content-type ,expires ,last-modified 等,详见官方类库。

httpcontent 系统提供了几个默认实现,主要如下几个:

完成OSS.Http底层HttpClient重构封装 支持标准库

3.  httpmessagehandler

此类主要作用是请求内容处理动作等的定义,如是否支持重定向,是否可以使用cookie,代理proxy等,偏向于系统的设置,可以此值通过httpclient构造函数传入其中,系统默认的提供的子类为httpclienthandler。

4.  httpclient

具体的请求实现调用实现,完整实现了post,get,delete等http请求方法,所有的方法最终调用的是sendasync方法。

上边的四个主要类,构成了httpclient请求的主要实现,如果你只是简单的使用,那么只需要关心httpclient即可,如下:

完成OSS.Http底层HttpClient重构封装 支持标准库

其实在它内部已经默认实现了httprequestmessage和httpclienthandler的赋值。

虽然简单介绍,但是基本上可以看出,httpclient的实现做了非常明确的分工,不是再像以前所有的设置都集中在webrequest中。分工的明确最直接的优势是httpclient实现了多请求共用,:

the default httpclient is the simplest way in which you can start sending requests. a single httpclient can be used to send as many http requests as you want concurrently so in many scenarios you can just create one httpclient and then use that for all your requests.

也就是当你系统中要发起不同的请求时,可以共用一个httpclient,而不用像httpwebreqest基本每次请求都需要重新定义一个对象,以减少资源的消耗。

二. 重构oss.http

  回到正题,重构我们的当前代码模块,如我所说,由于.net standard下完全不提供httpwebrequest的支持,直接导致了我做出重新实现的决定,因为以前httpwebrequest的简陋,所以我基本上做了很大的封装框架,上层完全不需要接触具体的底层实现,基本上实现了restsharp的核心,有兴趣的同学可以参考代码 oss.http 下old分支。

  重构之前由于对httpclient不是十分了解,本想延续已有框架流程,转换实现。不过随着对client文档的查看研究,发现很多封装已经完全不需要,流程也发生了变化,所以删除很多原来框架下的东西,重新整理出最终的实现。

  当然现在的httpclient本身实现已经足够简单清晰,不过在很多情况下直接调用post,get等方法,会减少部分代码的重用,像在oss.social项目中,底层我只需要实现一个restcommon方法,即可达到全局请求控制,调用方只需要提供url,httpmothed,parameter即可。

  这里我画了一个简单的流程图作为呈现:

完成OSS.Http底层HttpClient重构封装 支持标准库

流程基本没有太大的出入,代码在github,文件的结构如下:

  mos文件下: enum.cs  枚举类,fileparameter.cs 文件参数类,formparameter form表单参数类 ,oshttprequest 请求参数类,

  osrest.cs  是当前封装类的主要实现,同时为了保证httpclient本身功能通用,osrest继承自httpclient,同时提供了restsend方法,在这个方法中完成流程的实现并最终调用sendasync方法执行请求。

  restutil.cs  辅助类,完成了全局osrest(httpclient)的共用,并定义了一个默认httpclienthandler实现,正常直接调用这个类就可以了。

  流程中的执行用户自定义设置,可以在oshttprequest中的requestset委托属性中设置,例如可以设置访问类型是json:

完成OSS.Http底层HttpClient重构封装 支持标准库

三.  容易遇到的问题

  虽然整个重构后的代码已经不多了,但是应该还是有些问题可以给大家分享下

  1.  header赋值问题,请参见我第一部分,一定要分清不同headers,否则就可能给你报不正确的值错误

  2.  可以发现上边的流程图中有个“是否是get”的判断,因为如果是get请求,content是不能赋值的,就像在httpwebreqest中,如果get请求调用了getrequeststream方法,会有“无法发送具有此谓词类型的内容正文”的异常错误。当然如果你使用的是oss.http作为请求,那么就没有这个问题了。

  3.  和上传文件同时上传的表单参数,与单独的表单参数提交,是不一样的,请注意处理,不懂得参见osrest类即可,已经做了处理。

如果你还有其他问题,或者对后续的更新感兴趣,请关注公众号(osscoder):

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持服务器之家!

原文链接:http://www.cnblogs.com/sunhoy/p/6392305.html

延伸 · 阅读

精彩推荐
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25