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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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