nginx如何处理http请求_ASP.NET Core如何进行http请求

b4842bd42fcd07246586ef482c147264.png

一、 类使用存在的问题

HttpClient类的使用所存在的问题,百度搜索的文章一大堆,好多都是单纯文字描述,让人感觉不太好理解,为了更好理解HttpClient使用存在的问题,下面让我们通过代码跟示例来描述。

using(var client = new HttpClient())

传统关闭连接方法如上述代码所示,但当使用using语句释放HttpClient对象的时候,套接字(socket)也不会立即释放,下面我们通过请求aspnetmonsters站点的示例来验证下:

class Program

{

static void Main(string[] args)

{

Console.WriteLine("Starting connections");

var g = GetAsync();

g.Wait();

Console.WriteLine("Connections done");

Console.ReadKey();

}

static async Task GetAsync()

{

for (int i = 0; i < 5; i++)

{

using (var client = new HttpClient())

{

var result = await client.GetAsync("http://aspnetmonsters.com/");

Console.WriteLine(result.StatusCode);

}

}

}

}

输出结果:

82079e091feb22be60853e8ba8841bcf.png

控制台打印出五条请求站点返回状态的信息,下面我们通过netstat工具打印出五个请求连接套接字状态:

ddef65e086ddbd25d4e79655a7deef9c.png

应用程序已经运行结束了(结束连接),但是打印结果显示连接状态仍然是TIME_WAIT,也就是说在此状态期间仍然在观察是否有数据包进入连接(如果连接等待中有任何数据包仍然会通过),因为它们可能在某个地方被网络延迟,这是我从tcpstate窃取的TCP / IP状态图。

8431c3e5979fda3d0da1c3fab126f9a7.png

Windows将在此状态下保持连接240秒(由其设置[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParametersTcpTimedWaitDelay])。Windows可以快速打开新套接字的速度有限,因此如果您耗尽连接池,那么您可能会看到如下错误:

fe21a342568cbc83893b39c6a04da53e.png

而怎么做才可以减少套接字的浪费呢?我们在上述代码中把每次循环中创建的HttpClient对象拉到Main外定义为一个共享的静态实例:

class Program

{

private static HttpClient client = new HttpClient();

static void Main(string[] args)

{

Console.WriteLine("Starting connections");

var g = GetAsync();

g.Wait();

Console.WriteLine("Connections done");

Console.ReadKey();

}

static async Task GetAsync()

{

for (int i = 0; i < 5; i++)

{

var result = await client.GetAsync("http://aspnetmonsters.com/");

Console.WriteLine(result.StatusCode);

}

}

}

应用程序运动完毕之后,我们再通过netstat工具打印出五个请求连接套接字状态,这时候会看到信息如下:

61f933629c887929b4496d9b360f4fe3.png

通过共享一个实例,减少了套接字的浪费,实际上由于套接字重用而传输快一点。

总结:

在创建HttpClient实例的时候,最好是静态(static )实例。

不要用using包装HttpClient对象。

在.NET Core 2.1版本之后引入的 HttpClientFactory解决了HttpClient的所有痛点。有了 HttpClientFactory,我们不需要关心如何创建HttpClient,又如何释放它。

通过它可以创建具有特定业务的HttpClient,而且可以很友好的和 DI 容器结合使用,更为灵活。下面以 ASP.NET Core为例介绍HttpClientFactory的四种使用方式。

二、HttpClientFactory 的多种使用方式

可以通过多种使用方式在应用程序中使用HttpClientFactory。

2.1、直接使用HttpClientFactory

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

services.AddHttpClient();

注册服务后,我们新建BasicUsageModel类使用IHttpClientFactory创建HttpClient实例:

public class BasicUsageModel

{

private readonly IHttpClientFactory _clientFactory;

public IEnumerable Branches { get; private set; }

public bool GetBranchesError { get; private set; }

public BasicUsageModel(IHttpClientFactory clientFactory)

{

_clientFactory = clientFactory;

}

public async Task OnGet()

{

var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/aspnet/AspNetCore.Docs/branches");

request.Headers.Add("Accept

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值