├── donate2laojiu.png
├── HttpMessageHandlerFactory.Polly
├── PollyHttpMessageHandlerBuilderExtensions.cs
└── HttpMessageHandlerFactory.Polly.csproj
├── HttpMessageHandlerFactory
├── Implementations
│ ├── NameRegistration.cs
│ ├── NameProxy.cs
│ ├── LifetimeHttpHandler.cs
│ ├── NonCapturingTimer.cs
│ ├── ExpiredHandlerEntry.cs
│ ├── ActiveHandlerEntry.cs
│ ├── HttpMessageHandlerBuilder.cs
│ ├── DefaultHttpMessageHandlerFactory.cs
│ └── ExpiredHandlerEntryCleaner.cs
├── DependencyInjection
│ ├── IHttpMessageHandlerBuilder.cs
│ ├── ServiceCollectionExtensions.cs
│ └── HttpMessageHandlerBuilderExtensions.cs
├── HttpMessageHandlerFactory.csproj
├── IHttpMessageHandlerFactory.cs
├── HttpMessageHandlerOptions.cs
├── HttpMessageHandlerFactoryExtensions.cs
└── CookieHttpHandler.cs
├── ConsoleApp
├── ConsoleApp.csproj
├── AppHttpHandler.cs
└── Program.cs
├── Directory.Build.props
├── LICENSE
├── HttpMessageHandlerFactory.sln
├── .gitattributes
├── README.md
└── .gitignore
/donate2laojiu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xljiulang/HttpMessageHandlerFactory/HEAD/donate2laojiu.png
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory.Polly/PollyHttpMessageHandlerBuilderExtensions.cs:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xljiulang/HttpMessageHandlerFactory/HEAD/HttpMessageHandlerFactory.Polly/PollyHttpMessageHandlerBuilderExtensions.cs
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/Implementations/NameRegistration.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace HttpMessageHandlerFactory.Implementations
4 | {
5 | ///
6 | /// 别登记
7 | ///
8 | sealed class NameRegistration : HashSet
9 | {
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/Implementations/NameProxy.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace HttpMessageHandlerFactory.Implementations
4 | {
5 | ///
6 | /// 别名和代理
7 | ///
8 | /// 别名
9 | /// 支持携带UserInfo的代理地址
10 | sealed record NameProxy(string Name, Uri? ProxyUri);
11 | }
12 |
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/DependencyInjection/IHttpMessageHandlerBuilder.cs:
--------------------------------------------------------------------------------
1 | namespace Microsoft.Extensions.DependencyInjection
2 | {
3 | ///
4 | /// Http消息处理者创建者
5 | ///
6 | public interface IHttpMessageHandlerBuilder
7 | {
8 | ///
9 | /// 选项名
10 | ///
11 | string Name { get; }
12 |
13 | ///
14 | /// 服务集合
15 | ///
16 | IServiceCollection Services { get; }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/HttpMessageHandlerFactory.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | HttpMessageHandlerFactory
5 | 具有生命周期管理和动态Web代理的HttpMessageHandler创建工厂
6 | $(TargetPath)\$(AssemblyName).xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/ConsoleApp/ConsoleApp.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | net6.0
6 | enable
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/IHttpMessageHandlerFactory.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Net.Http;
3 |
4 | namespace HttpMessageHandlerFactory
5 | {
6 | ///
7 | /// Http消息处理者工厂
8 | ///
9 | public interface IHttpMessageHandlerFactory
10 | {
11 | ///
12 | /// 创建用于请求的HttpMessageHandler
13 | ///
14 | /// 别名
15 | /// 支持携带UserInfo的代理地址
16 | ///
17 | HttpMessageHandler CreateHandler(string name, Uri? proxyUri);
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Directory.Build.props:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1.0.1
4 | enable
5 | net6.0
6 | true
7 | laojiu
8 | laojiu
9 | $(MSBuildThisFileDirectory)artifacts
10 | true
11 | MIT
12 | https://github.com/xljiulang/HttpMessageHandlerFactory
13 |
14 |
15 |
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory.Polly/HttpMessageHandlerFactory.Polly.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | HttpMessageHandlerFactory.Polly
5 | 为HttpMessageHandlerFactory提供Polly策略扩展
6 | $(TargetPath)\$(AssemblyName).xml
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/Implementations/LifetimeHttpHandler.cs:
--------------------------------------------------------------------------------
1 | using System.Net.Http;
2 |
3 | namespace HttpMessageHandlerFactory.Implementations
4 | {
5 | ///
6 | /// 表示自主管理生命周期的的HttpMessageHandler
7 | ///
8 | sealed class LifetimeHttpHandler : DelegatingHandler
9 | {
10 | ///
11 | /// 具有生命周期的HttpHandler
12 | ///
13 | ///
14 | public LifetimeHttpHandler(HttpMessageHandler httpHandler)
15 | {
16 | this.InnerHandler = httpHandler;
17 | }
18 |
19 | ///
20 | /// 这里不释放资源
21 | ///
22 | ///
23 | protected override void Dispose(bool disposing)
24 | {
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/ConsoleApp/AppHttpHandler.cs:
--------------------------------------------------------------------------------
1 | using Microsoft.Extensions.Logging;
2 | using Microsoft.Extensions.Logging.Abstractions;
3 | using System.Net.Http;
4 | using System.Threading;
5 | using System.Threading.Tasks;
6 |
7 | namespace ConsoleApp
8 | {
9 | sealed class AppHttpHandler : DelegatingHandler
10 | {
11 | private readonly ILogger logger;
12 |
13 | public AppHttpHandler()
14 | : this(NullLogger.Instance)
15 | {
16 | }
17 |
18 | public AppHttpHandler(ILogger logger)
19 | {
20 | this.logger = logger;
21 | }
22 |
23 | protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
24 | {
25 | this.logger.LogInformation($"App开始请求{request.RequestUri}");
26 | var response = await base.SendAsync(request, cancellationToken);
27 |
28 | this.logger.LogInformation($"App请求{request.RequestUri}完成");
29 | return response;
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/ConsoleApp/Program.cs:
--------------------------------------------------------------------------------
1 | using HttpMessageHandlerFactory;
2 | using Microsoft.Extensions.DependencyInjection;
3 | using Microsoft.Extensions.Logging;
4 | using System;
5 | using System.Threading.Tasks;
6 |
7 | namespace ConsoleApp
8 | {
9 | class Program
10 | {
11 | static async Task Main(string[] args)
12 | {
13 | var services = new ServiceCollection();
14 | services.AddLogging(x => x.AddConsole());
15 | services.AddHttpMessageHandlerFactory("App")
16 | .AddHttpMessageHandler()
17 | .SetHandlerLifetime(TimeSpan.FromMinutes(1d));
18 |
19 | var serviceProvider = services.BuildServiceProvider();
20 | var factory = serviceProvider.GetRequiredService();
21 |
22 | var proxyUri = default(Uri);
23 | var httpClient = factory.CreateClient("App", proxyUri);
24 | var html = await httpClient.GetStringAsync("https://github.com/xljiulang/HttpMessageHandlerFactory/blob/master/README.md");
25 | Console.WriteLine(html);
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------
/HttpMessageHandlerFactory/HttpMessageHandlerOptions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Net.Http;
4 |
5 | namespace HttpMessageHandlerFactory
6 | {
7 | ///
8 | /// HttpMessageHandler选项
9 | ///
10 | public class HttpMessageHandlerOptions
11 | {
12 | ///
13 | /// 获取或设置生命周期
14 | /// 默认两分钟
15 | ///
16 | public TimeSpan Lifetime { get; set; } = TimeSpan.FromMinutes(2d);
17 |
18 | ///
19 | /// 获取属性记录字典
20 | ///
21 | public Dictionary