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.

91 lines
2.6 KiB
C#

2 days ago
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HttpClientStudy.UnitTest.HttpClients
{
/// <summary>
/// 管道构建器
/// </summary>
public class HttpMessageHandlerBuilder
{
public List<DelegatingHandler> Handlers { get; set; }
public HttpMessageHandlerBuilder()
{
this.Handlers = new List<DelegatingHandler>();
}
public HttpMessageHandlerBuilder(List<DelegatingHandler> handlers) : base()
{
if (handlers != null)
{
this.Handlers = handlers;
}
}
public void AddHttpMessageHandler(DelegatingHandler handler)
{
Handlers.Add(handler);
}
public void RemoveHttpMessageHandler(DelegatingHandler handler)
{
Handlers.Remove(handler);
}
public List<DelegatingHandler> FindHttpMessageHandler(DelegatingHandler handler)
{
return Handlers.Where(h => h.GetType() == handler.GetType()).ToList();
}
/// <summary>
/// 根据管道配置创建一个新HttpClient实例
/// </summary>
public HttpClient Build()
{
if (this.Handlers == null || this.Handlers.Count == 0)
{
return new HttpClient();
}
//默认最终处理器
HttpMessageHandler defaultLastHandler = new SocketsHttpHandler()
{
//自定义配置
PooledConnectionLifetime = TimeSpan.FromSeconds(120),
};
//倒序组装:完成后执行顺序与注册顺序一致
//拷贝份,省得多次调用有问题
HttpMessageHandler currentHandler = new SocketsHttpHandler()
{
//自定义配置
PooledConnectionLifetime = TimeSpan.FromSeconds(120),
};
var builderHandlers = this.Handlers.ToList<DelegatingHandler>();
builderHandlers.Reverse();
if (builderHandlers[0].InnerHandler != null)
{
currentHandler = builderHandlers[0].InnerHandler;
}
for (int i = 0; i < builderHandlers.Count; i++)
{
builderHandlers[i].InnerHandler = currentHandler;
currentHandler = builderHandlers[i];
}
// 利用管道创建HttpClient
var httpClient = new HttpClient(currentHandler);
return httpClient;
}
}
}