You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

78 lines
2.6 KiB
C#

8 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Http.Json;
using System.Net;
using Newtonsoft.Json;
using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
using System.Security.Authentication.ExtendedProtection;
using Newtonsoft.Json.Linq;
using System.Text.Json.Serialization.Metadata;
8 months ago
namespace HttpClientStudy.UnitTest.HttpClients
8 months ago
{
/// <summary>
/// HttpClient 常见问题测试
/// </summary>
public class HttpClientQuestTest
{
private readonly ITestOutputHelper _logger;
8 months ago
public HttpClientQuestTest(ITestOutputHelper outputHelper)
8 months ago
{
_logger = outputHelper;
}
/// <summary>
/// 多HttpClient实例问题
/// 1、HttpClient虽然继承了 IDisposable 接口但它是可以被共享的且线程安全。Using使用并不能立即释放
/// 2、网络特性虽然HttpClient客户端断开但Web服务并不知道连接依然存在状态为 “ TIME_WAIT”(继续等待看是否还有延迟的包会传输过来。)
/// Windows默认为 240s
/// 引发常见问题:
/// 1、HttpClient 多实例并存,有很大资源消耗;
/// 2、在高并发的情况下连接来不及释放 socket 被耗尽: 程序异常
/// 3、连带着会出现“各种套接字问题”
///
/// 查看问题:
/// 程序并发或多次请求后,通过 netstate 查看下 TCP 连接情况:有很多 TIME_WAIT 状态连接;很可能程序异常;
///
/// 解决:
/// 1、复用HttpClient
/// 2、HttpClientFactory
/// 3、解决DNS问题可以给HttpClient传参SocketsHttpHandler
/// </summary>
/// <returns></returns>
[Fact]
public async Task Multi_ClientObject_Test()
{
8 months ago
for (int i = 0; i < 100; i++)
8 months ago
{
HttpClient httpClient = new HttpClient();
8 months ago
var responseMessage = await httpClient.GetAsync(TestConfig.WebApiBaseUrl + "/api/account/ping");
8 months ago
responseMessage.EnsureSuccessStatusCode();
}
}
[Fact]
public async Task Multi_ClientObject2_Test()
{
HttpClient httpClient = new HttpClient()
{
8 months ago
BaseAddress = new Uri(TestConfig.WebApiBaseUrl)
8 months ago
};
8 months ago
for (int i = 0; i < 100; i++)
8 months ago
{
8 months ago
var responseMessage = await httpClient.GetAsync("/api/account/ping");
8 months ago
responseMessage.EnsureSuccessStatusCode();
}
}
}
8 months ago
}