|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|