HttpClientFactory.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using FastGithub.Configuration;
  2. using FastGithub.DomainResolve;
  3. using System;
  4. using System.Collections.Concurrent;
  5. namespace FastGithub.Http
  6. {
  7. /// <summary>
  8. /// HttpClient工厂
  9. /// </summary>
  10. sealed class HttpClientFactory : IHttpClientFactory
  11. {
  12. private readonly IDomainResolver domainResolver;
  13. /// <summary>
  14. /// httpHandler的生命周期
  15. /// </summary>
  16. private readonly TimeSpan lifeTime = TimeSpan.FromMinutes(1d);
  17. /// <summary>
  18. /// HttpHandler清理器
  19. /// </summary>
  20. private readonly LifetimeHttpHandlerCleaner httpHandlerCleaner = new();
  21. /// <summary>
  22. /// LazyOf(LifetimeHttpHandler)缓存
  23. /// </summary>
  24. private readonly ConcurrentDictionary<DomainConfig, Lazy<LifetimeHttpHandler>> httpHandlerLazyCache = new();
  25. /// <summary>
  26. /// HttpClient工厂
  27. /// </summary>
  28. /// <param name="domainResolver"></param>
  29. public HttpClientFactory(IDomainResolver domainResolver)
  30. {
  31. this.domainResolver = domainResolver;
  32. }
  33. /// <summary>
  34. /// 创建httpClient
  35. /// </summary>
  36. /// <param name="domainConfig"></param>
  37. /// <returns></returns>
  38. public HttpClient CreateHttpClient(DomainConfig domainConfig)
  39. {
  40. var lifetimeHttpHandlerLazy = this.httpHandlerLazyCache.GetOrAdd(domainConfig, this.CreateLifetimeHttpHandlerLazy);
  41. var lifetimeHttpHandler = lifetimeHttpHandlerLazy.Value;
  42. return new HttpClient(lifetimeHttpHandler, disposeHandler: false);
  43. }
  44. /// <summary>
  45. /// 创建LazyOf(LifetimeHttpHandler)
  46. /// </summary>
  47. /// <param name="domainConfig"></param>
  48. /// <returns></returns>
  49. private Lazy<LifetimeHttpHandler> CreateLifetimeHttpHandlerLazy(DomainConfig domainConfig)
  50. {
  51. return new Lazy<LifetimeHttpHandler>(() => this.CreateLifetimeHttpHandler(domainConfig), true);
  52. }
  53. /// <summary>
  54. /// 创建LifetimeHttpHandler
  55. /// </summary>
  56. /// <returns></returns>
  57. private LifetimeHttpHandler CreateLifetimeHttpHandler(DomainConfig domainConfig)
  58. {
  59. var httpClientHandler = new HttpClientHandler(domainConfig, this.domainResolver);
  60. return new LifetimeHttpHandler(httpClientHandler, this.lifeTime, this.OnLifetimeHttpHandlerDeactivate);
  61. }
  62. /// <summary>
  63. /// 当有httpHandler失效时
  64. /// </summary>
  65. /// <param name="lifetimeHttpHandler">httpHandler</param>
  66. private void OnLifetimeHttpHandlerDeactivate(LifetimeHttpHandler lifetimeHttpHandler)
  67. {
  68. // 切换激活状态的记录的实例
  69. var domainConfig = ((HttpClientHandler)lifetimeHttpHandler.InnerHandler!).DomainConfig;
  70. this.httpHandlerLazyCache[domainConfig] = this.CreateLifetimeHttpHandlerLazy(domainConfig);
  71. this.httpHandlerCleaner.Add(lifetimeHttpHandler);
  72. }
  73. }
  74. }