After considering this interesting answer HttpClient.GetAsync(...) never returns..., I still have a situation where my HttpClient is not returning when I use await (sample code below). In addition. I use this helper routine from both asp.net MVC5 Controllers (UI-driven) and the WebApi. What can I do to:
- Use await instead of the (dreaded) .Result and still have this function return?
- Reuse this same routine from both MVC Controllers and WebApi?
Apparently, I should replace the .Result with .ConfigureAwait(false) but this seems to contradict with the fact that "Task4" in the post cited above works fine with an await httpClient.GetAsync. Or do I need separate routines for Controller and WebApi cases?
public static async Task<IEnumerable<TcMarketUserFullV1>> TcSearchMultiUsersAsync(string elasticQuery)
{
    if (string.IsNullOrEmpty(elasticQuery)) return null;
    IEnumerable<TcMarketUserFullV1> res = null;
    using (var hclient = new HttpClient())
    {
        hclient.BaseAddress = new Uri("https://addr.servicex.com");
        hclient.DefaultRequestHeaders.Accept.Clear();
        hclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        hclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",
            CloudConfigurationManager.GetSetting("jwt-bearer-token"));
        // Why does this never return when await is used?
        HttpResponseMessage response =  hclient.GetAsync("api/v2/users?q=" + elasticQuery + "&search_engine=v2").Result; 
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            res = JsonConvert.DeserializeObject<TcMarketUserFullV1[]>(content).AsEnumerable();
        }
        else{log.Warn("...");}
    } 
    return res;
} 
UPDATE: My call chain, which starts with a Telerik Kendo Mvc.Grid DataBinding call is as follows:
[HttpPost]
public async Task<ActionResult> TopLicenseGrid_Read([DataSourceRequest]DataSourceRequest request)
{
    var res = await GetLicenseInfo();
    return Json(res.ToDataSourceResult(request)); // Kendo.Mvc.Extensions.DataSourceRequest
}
Then:
private async Task<IEnumerable<CsoPortalLicenseInfoModel>> GetLicenseInfo()
{
  ...
  // Never returns
  var qry = @"app_metadata.tc_app_user.country:""DE""";
  return await TcSearchMultiUsersAsync(qry);
}
Then, the routine shown in full above but now WITHOUT the .Result:
public static async Task<IEnumerable<TcMarketUserFullV1>> TcSearchMultiUsersAsync(string elasticQuery)
{
    if (string.IsNullOrEmpty(elasticQuery)) return null;
    IEnumerable<TcMarketUserFullV1> res = null;
    using (var hclient = new HttpClient())
    {
        hclient.BaseAddress = new Uri("https://addr.servicex.com");
        hclient.DefaultRequestHeaders.Accept.Clear();
        hclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        hclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",
            CloudConfigurationManager.GetSetting("jwt-bearer-token"));
        // This now returns fine
        HttpResponseMessage response =  hclient.GetAsync("api/v2/users?search_engine=v2&q=" + elasticQuery"); 
        if (response.IsSuccessStatusCode)
        {
            // This returns my results fine too
            var content = await response.Content.ReadAsStringAsync();
            // The following line never returns results. When debugging, everything flows perfectly until I reach the following line, which never 
            // returns and the debugger returns me immediately to the top level HttpPost with a result of null. 
            res = JsonConvert.DeserializeObject<TcMarketUserFullV1[]>(content).AsEnumerable();
        }
        else{log.Warn("...");}
    } 
    return res;
} 
 
     
    