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.

69 lines
2.1 KiB
C#

8 months ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.Core
{
/// <summary>
/// 管道方式 HttpClient客户端
/// </summary>
8 months ago
public class PipelineHttpClient
8 months ago
{
public List<DelegatingHandler> HttpMessageHandlers { get; set; }
8 months ago
public PipelineHttpClient()
8 months ago
{
HttpMessageHandlers = new List<DelegatingHandler>()
8 months ago
{
8 months ago
new CustomHeadersHandler(),
new LoggingHandler(),
};
}
8 months ago
public PipelineHttpClient(List<DelegatingHandler> httpMessageHandlers)
{
8 months ago
HttpMessageHandlers = httpMessageHandlers;
if (httpMessageHandlers == null || httpMessageHandlers?.Count == 0)
{
HttpMessageHandlers = new List<DelegatingHandler>();
}
}
public void AddDelegatingHandler(DelegatingHandler handler)
8 months ago
{
HttpMessageHandlers.Add(handler);
8 months ago
}
public HttpClient CreateHttpClient()
{
//创建处理器链
//最终处理器最后一个请求处理程序默认是SocketsHttpHandler.
HttpMessageHandler currentPipeLine = new SocketsHttpHandler()
8 months ago
{
8 months ago
//自定义配置
PooledConnectionLifetime = TimeSpan.FromSeconds(120),
8 months ago
};
8 months ago
//pipeline = new CustomHeadersHandler() { InnerHandler = pipeline};
//pipeline = new LoggingHandler () { InnerHandler = pipeline};
//倒序组装:完成后执行顺序与注册顺序一致
HttpMessageHandlers.Reverse();
for (int i = 0; i < HttpMessageHandlers.Count; i++)
{
HttpMessageHandlers[i].InnerHandler = currentPipeLine;
currentPipeLine = HttpMessageHandlers[i];
}
// 利用管道创建HttpClient
var httpClient = new HttpClient(currentPipeLine);
return httpClient;
}
}
}