Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Andrei 15 posts 99 karma points
    Aug 25, 2021 @ 10:57
    Andrei
    0

    How to register IHttpClientFactory to use HttpClient correctly with multiple configurations

    In the example from Microsoft docs, they register the HttpClient factory with the specific extension method like:

    services.AddHttpClient<IMyCustomService, CustomService>(httpClient =>
    {
        httpClient.BaseAddress = new Uri(Configuration["BaseUrl"]);
    })
    

    Umbraco is registering services with composers and I can't find any way to hook into an IServiceCollection where I could use the extension method.

    Any idea how I can achieve the same thing as above with the 'umbraco way'?

  • Lucas Michaelsen 32 posts 233 karma points
    Sep 16, 2021 @ 11:27
    Lucas Michaelsen
    0

    Hello Andrei.

    The example from microsoft is for .NET Core.

    The way I normal do this HttpClient in terms of Umbraco and .Net 4.x. I start by creating a Service of Depency injectable Class. Where HttpClient is Static, without dispose it. It means i share the connectionPool the HttpClient start.

    public class TestService : ITestService {
         private static HttpClient _httpClient;
    
         public TestService() {
              if (_httpClient == null) {
                   _httpClient = new HttpClient() { 
                       BaseAddress = new Uri("https://google.com") 
                   }
              }
         }
    
         public bool CallGoogle() {
             return _httpClient.GetAsync("")
                 .GetAwaiter()
                 .GetResult()
                 .IsSuccessStatusCode;
         }
    }
    

    From my RenderMvcController it will be like this:

     public class FrontpageController : RenderMvcController {
          private readonly ITestService _testService;
    
          public FrontpageController(ITestService testService) {
               _testService = testService;
          }
    
          public override ActionResult Index(ContentModel contentModel) {
               _testService.CallGoogle();
    
               return CurrentTemplate(contentModel);
          }
     }
    

    At last but not least, i register the component to Umbraco DI, with a lifetime deffindt to be a singleton Lifetime.Singleton - one unique instance for the whole web application: The single instance will be shared across all web requests.

    public class IocComposer : IUserComposer {
         public void Compose(Composition composition) {
              composition.Register<ITestService, TestService(liftetime: Lifetime.Singleton);
         }
    }
    

    Hops this will help you :)

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies