.Net Core下HTTP请求IHttpClientFactory示例详解_实用技巧

来源:脚本之家  责任编辑:小易  

以前.Net开发人员只需要选定运行时和.Net框架即可。但现在,它是Windows生态系统从物联网到云最宽泛的一部分。开发人员有更多选择,这在Microsoft的Visual Studio 2017的新安装程序中显而易见。当涉及到编写C#,F#或Visual Basic,有广泛的.Net变体和平台可以选择。这不是一件坏事,.Net跨平台运行时本来就是微软的最初目标之一,虽然当时未能如愿,因为微软没有击败Flash。有趣的是,Visual Studio安装程序对新家庭成员.Net Core十分重视。当选择构建ASP.Net Web应用程序或想使用容器跨平台应用程序时,.Net Core是将熟悉的Windows开发工具应用到更广泛的Microsoft生态系统,特别是下一代企业应用程序的构建。Net Core不是特别好理解,也许最好考虑对.Net进行彻底重构以支持跨平台开发,.Net Core已经迅速成为.Net基金会开源工作的核心。Net Core可以比其他.Net运行时和库更快地响应对新平台的需求。例如,三星正在将其添加到Tizen操作系统,最近的.Net Core版本支持在Raspberry Pi上运行代码。它也是使用.Net语言构建通用Windows平台(UWP)应用程序的基础。虽然.Net Core具有许多其他.Net平台的部分功能,但它专注于提供基于控制台的服务器应用程序。它在Windows,MacOS和Linux上提供构建和运行命令行应用程序的工具,它也是用于构建ASP.Net Core Web应用程序的工具。在Windows Server Nano上运行.Net Core,使用熟悉的工具在Windows容器中构建和运行微服务www.zgxue.com防采集请勿采集本网。

使用方式

IHttpClientFactory有四种模式: 基本用法 命名客户端 类型化客户端 生成的客户端

基本用法

NET Core 使用Dapper 操作MySQL 数据库,.NET Core 使用Dapper。目前官方没有出.NET Core MySQL 驱动,但是已经有第三方进行改动封装出.NET Core MySQL Connector 预览版。Dapper 也已经出了.

在 Startup.ConfigureServices 方法中,通过在 IServiceCollection 上调用 AddHttpClient 扩展方法可以注册 IHttpClientFactory

不一样 ASP.NET Core 是一个用于net程序跨平台的框架,在它的基础上会重写.NET Framework(windows)、Mono(Linux),以实现所有net程序、网站的跨平台 ASP.net 是一种微软推出的网站开发技术 目前

services.AddHttpClient();

简单来说就是一个跨平台组件,可以让某种语言运行在.net core上,从而获取“一次编译,到处运行”的能力。比如说C#运行在.net core上,可以运行在Windows,unix,linux,mac os,安卓,SP,ios等多个

注册之后可以像依赖注入DI似得在类中通过构造函数注入形式使用,伪代码:

ASP.NET Core开发,开发并使用中间件(Middleware)。中间件是被组装成一个应用程序管道来处理请求和响应的软件组件。每个组件选择是否传递给管道中的下一个组件的请求,并能之前和下一组分在管道

class A{ private readonly IHttpClientFactory _clientFactory; public A(IHttpClientFactory clientFactory) { _clientFactory = clientFactory; } Public void Use() { var request=new HttpRequestMessage(HttpMethod.Get,"www.baidu.com") ; var client = _clientFactory.CreateClient(); var response = await client.SendAsync(request); if (response.IsSuccessStatusCode) { Branches = await response.Content.ReadAsAsync<IEnumerable<GitHubBranch>>(); } else { GetBranchesError = true; Branches = Array.Empty<GitHubBranch>(); } }}

命名客户端

在命令行(cmd)中输入 dotnet-version 或 dotnet-info 如果能正确显示信息就表示安装成功

也是在基本用法的基础上增加配置参数:例如增加一个baidu下的客户端:

services.AddHttpClient("baidu",c=>{ c.BaseAddress = new Uri("https://api.baidu.com/"); //其他一些参数});

然后在使用的时候只是需要传递客户端名称就自动使用baidu这个地址的基础地址配置:

var client = _clientFactory.CreateClient("baidu");

类型化客户端

说的明白一点就是在使用类的构造函数中可以直接接受HttpClient 类型,不用在使用IHttpClientFactory 接口的CreateClient方法创建,但是首要条件就是要先创建注入类型,然后在ConfigureServices 方法同时注入:

services.AddHttpClient<classHttp>();

注入类型:

public class classHttp{ public HttpClient Client { get; } public GitHubService(HttpClient client) { client.BaseAddress = new Uri("https://api.baidu.com/"); //同ConfigureServices 中一样设置一些其他参数 Client = client; }}

生成的客户端

这个我个人理解为就是配置使用第三方库,然后可以注入接口类型,接口中可以写一些方法接口。然后通过接口类直接调用接口。

个人理解:就是类似于一个接口映射,地址映射似得。通过结合第三方库(官方推荐Refit)实现请求一个地址别名的方式,别名就是指定义的接口。然后别名通过增加特性Get(“路径”)或者post("路径)的形式重新指向真实的请求接口地址。通过请求这个本地接口方法实现转化请求的真实地址。

举例定义接口:

public interface IHelloClient{ [Get("/MyInterFace")] Task<Reply> GetMessageAsync();}

配置Refit插件:

也是和正常配置类似,在后面增加接口的服务注入。

public void ConfigureServices(IServiceCollection services){ services.AddHttpClient("hello", c => { c.BaseAddress = new Uri("http://localhost:5000"); }) .AddTypedClient(c => Refit.RestService.For<IHelloClient>(c)); services.AddMvc();}

然后再说接口上面的Get("/MyInterFace")方法;这个我们就不做另一个项目就在当前项目下,所以可以直接就在api项目下创建一个名为MyInterFace的方法。

[ApiController]public class TestController : ControllerBase{ [HttpGet("/")] public async Task<sting> MyInterFace() { return "ceshi"; }}

然后就可以使用接口了:

[ApiController]public class ValuesController : ControllerBase{ private readonly IHelloClient _client; public ValuesController(IHelloClient client) { _client = client; } [HttpGet("/")] public async Task<ActionResult<Reply>> Index() { return await _client.GetMessageAsync(); }}

在这了的_client.GetMessageAsync()方法就是调用了接口方法,看着是调用了GetMessageAsync方法其实是做了映射,映射地址就是上面特性写的MyInterFace方法。通过断点也可以验证此结论。然后不同项目下也是同一个意思,假如我们请求百度的地址:www.baidu.com/api/b这个接口

我们在配置出把请求地址http://localhost:5000改为www.baidu.com/api,然后再把GetMessageAsync方法上面的MyInterFace改为b即可。

出站请求中间件

个人理解为请求返回前处理程序,就是继承 DelegatingHandler派生类重写SendAsync 方法。在将请求传递至管道中的下一个处理程序之前执行代码:

public class ValidateHeaderHandler : DelegatingHandler{ protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { if (!request.Headers.Contains("X-API-KEY")) { return new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent( "You must supply an API key header called X-API-KEY") }; } return await base.SendAsync(request, cancellationToken); }}

然后在ConfigureServices中:

services.AddTransient<ValidateHeaderHandler>();//注册处理程序services.AddHttpClient("externalservice", c =>{ // Assume this is an "external" service which requires an API KEY c.BaseAddress = new Uri("https://localhost:5000/");}).AddHttpMessageHandler<ValidateHeaderHandler>();/注入到http请求管道

可以同时注册多个处理程序。

HttpClient和生存周期

每次对 IHttpClientFactory 调用 CreateClient 都会返回一个新 HttpClient 实例。 每个命名的客户端都具有一个 HttpMessageHandler。 工厂管理 HttpMessageHandler 实例的生存期。

 HttpClient实例不是与HttpMessageHandler一起销毁的,HttpMessageHandler在池中生存,如果生命周期未到不会被销毁,会被新的HttpClient 实例使用。

处理程序的默认生存周期是2分钟,可以通过配置修改:

services.AddHttpClient("extendedhandlerlifetime") .SetHandlerLifetime(TimeSpan.FromMinutes(5));

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对真格学网的支持。

你可以在 OSX 和 Linux上运行 ASP.NET Core 应用,这对于 ASP.NET 来说,这具有跨时代的意义,也给 ASP.NET 开发者和设计师们带来了全新的体验。ASP.NET Core 具有两个运行时,这意味着你可以选择不同的运行环境来部署你的应用,使得你的应用将更加灵活。ASP.NET Core 1.0 是一个 ASP.NET 的重构版本,它运行于最新的.NET Core。它是模块化的,允许开发者以插件的形式添加应用所需要的模块,大多数的功能都将作为插件提供并通过 NuGet 程序包管理。这样做的一个好处就是你可以升级应用的一个模块,但丝毫不会影响其他模块;另外,.NET Core 是一个跨平台的运行时,因此你可以在 OSX 或 Linux 操作系统上部署你的应用;它也是一个云优化的运行时,用于在云上部署和调试应用;NET Core 可以和你的应用程序一起被部署,当服务器上有多个.NET Core 版本时,你依旧可以运行 ASP.NET Core 应用内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • asp.net core中调整http请求大小的几种方法详解
  • .net core并发请求发送httpwebrequest的坑解决
  • asp.net core中间件计算http请求时间示例详解
  • 详解.net core 使用httpclient ssl请求出错的解决办法
  • 使用asp.net改变图片颜色如灰色的变成彩色
  • .net core之微信支付之公众号、h5支付详解
  • asp.net(c#)文件下载实现代码
  • 一个asp.net的显示分页方法 附加实体转换和存储过程 带源码下载
  • .net中可空值类型【nullable<t>】实现原理
  • asp.net网站底部的版权信息实现代码且可维护
  • asp.net(vb)写的后台发送短信实现代码
  • 在asp.net core中使用类似application的服务的实现
  • asp.net中安全退出时清空session或cookie的实例代码
  • asp.net中gridview编辑,更新,合计用法示例
  • 如何查看 net core版本
  • Net 框架和.Net Core,我该用哪个?怎么选
  • 如何验证.net core安装成功
  • net core是托管代码吗
  • net core 怎么操作数据库
  • 应该在哪个阶段开始.net core
  • 什么是.NET CORE
  • net core支持中间件开发吗
  • 如何验证.net core安装成功
  • NET Core和.NET Standard有什么不同
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧asp.net core中调整http请求大小的几种方法详解.net core并发请求发送httpwebrequest的坑解决asp.net core中间件计算http请求时间示例详解详解.net core 使用httpclient ssl请求出错的解决办法使用asp.net改变图片颜色如灰色的变成彩色.net core之微信支付之公众号、h5支付详解asp.net(c#)文件下载实现代码一个asp.net的显示分页方法 附加实体转换和存储过程 带源码下载.net中可空值类型【nullable<t>】实现原理asp.net网站底部的版权信息实现代码且可维护asp.net(vb)写的后台发送短信实现代码在asp.net core中使用类似application的服务的实现asp.net中安全退出时清空session或cookie的实例代码asp.net中gridview编辑,更新,合计用法示例java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net汉字转拼音和获取汉字首字asp.net对路径"xxxxx".net core部署到centos的图文教程asp.net mvc用存储过程批量添加修改数据操巧用asp.net预编译web应用程序规避调用延一个简单的自定义程序日志小样例asp.net下载大文件的实现方法一个合格的程序员应该读过哪些书(偏java)abp(现代asp.net样板开发框架)系列之二、.net实现xml与datatable互转的实例代码vs2015 iis express无法启动的解决方法wpf中自定义gridlengthanimation
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved