I have an old version of ASP.NET MVC app that doesn't have a Startup.cs. I wanted to implement a clean way to have an HttpClient that I would use for my API calls to third parties.
Here's what I've done so far based on some ideas/recommendations I've received for this question. The problem is that when I make the API call, it goes nowhere. I put it in a try catch but I'm not even getting an exception. The API provider tells me that they're not seeing the search parameter.
First, I created this HttpClientAccessor for lazy loading.
public static class HttpClientAccessor
{
   public static Func<HttpClient> ValueFactory = () =>
   {
      var client = new HttpClient();
      client.BaseAddress = new Uri("https://apiUrl.com");
      client.DefaultRequestHeaders.Accept.Clear();
      client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
      client.DefaultRequestHeaders.TryAddWithoutValidation("APIAccessToken", "token1");
      client.DefaultRequestHeaders.TryAddWithoutValidation("UserToken", "token2");
       return client;
   };
   private static Lazy<HttpClient> client = new Lazy<HttpClient>(ValueFactory);
   public static HttpClient HttpClient
   {
      get { return client.Value; }
   }
}
I then created an API client of my own so that I can have the API call functions in one place which looks like this:
public class MyApiClient
{
   public async Task GetSomeData()
   {
       var client = HttpClientAccessor.HttpClient;
       try
       {
           var result = await client.GetStringAsync("somedata/search?text=test");
           var output = JObject.Parse(result);
       }
       catch(Exception e)
       {
           var error = e.Message;
       }
    }
}
Then in my ASP.NET Controller action, I do this:
public class MyController : Controller
{
   private static readonly MyApiClient _apiClient = new MyApiClient ();
   public ActionResult ApiTest()
   {
       var data = _apiClient.GetSomeData().Wait();
   }
}
Any idea where my mistake is?
UPDATE: This simple approach works fine:
public class MyController : Controller
{
   private static readonly HttpClient _client = new HttpClient();
   public ActionResult ApiTest()
   {
       _client.BaseAddress = new Uri("https://apiUrl.com");
       _client.DefaultRequestHeaders.Accept.Clear();
       _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
       _client.DefaultRequestHeaders.TryAddWithoutValidation("APIAccessToken", "token1");
       _client.DefaultRequestHeaders.TryAddWithoutValidation("UserToken", "token2");
       var response = _client.GetStringAsync("somedata/search?text=test").Result;
   }
}
 
     
     
     
    