1

I have this method running in a .NET Core 2.X app running in Azure app service. I have a remote server that we use this method to call from button presses in our Angular website. that calls a remote device.

Angular button --> .NET Core app service in Azure --> another app service --> internet\cell connected device. We wait for the response from the device to return a status code.

If I quickly send commands [2 or 3 in a second] to this method it causes the app service to stop responding until I restart it. I read this post and added the [, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false)].

However I can still freeze the entire app and require a restart from quickly sending commands to this method.

private async void SetEndPointValueAsync(string stunnelUrl, string username, string password)
{
            try
            {
                //set the user name and password
                var httpClientHandler = new HttpClientHandler()
                {
                    Credentials = new NetworkCredential(username, password)
                };
                using (var client = new HttpClient(httpClientHandler))
                {
                    using (var response = await client.GetAsync(stunnelUrl**, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false)**)
                    {
                        if (response.IsSuccessStatusCode)
                        {
                            LogInfo(typeof(IntegrationService), stunnelUrl, LogAction.EndpointUpdate);
                        }
                        else
                        {
                            //request failed.
                            LogWarning(typeof(IntegrationService), stunnelUrl, LogAction.DeviceRequest);
                        }
                        //using (var content = response.Content)
                        //{
                        //    //do here your changes when required
                        //}
                    }
                }
            }
            catch (Exception e)
            {
                LogErrorDetailed(e, typeof(IntegrationService), stunnelUrl, LogAction.DeviceRequest);
            }
}
marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Steve Coleman
  • 1,987
  • 2
  • 17
  • 28
  • 1
    `async void` is always a red flag, unless it's an event handler. Any reason you're not returning a `Task`? And how are you calling this method? Can we see that code? – Gabriel Luci Dec 14 '19 at 17:57

1 Answers1

2

Generally, you don't want to create so many instances of HttpClient as you lose a lot of the benefits of the management it provides.

You could reduce some overhead by only having a single instance of it, like so...

private readonly HttpClient _client;

public ClassConstructor(HttpClient client)
{
    _client = client ?? new HttpClient();       
}

Then you could change your method to look something like this...

private async Task SetEndPointValueAsync(Uri stunnelUri, string username, string password)
{
    if (stunnelUri == null) throw new ArgumentNullException(nameof(stunnelUri));
    if (String.IsNullOrEmpty(username)) throw new ArgumentNullException(nameof(username));
    if (String.IsNullOrEmpty(password)) throw new ArgumentNullException(nameof(password));

    byte[] byteArray = Encoding.ASCII.GetBytes($"{username}:{password}");
    string scheme = "Basic";
    string parameter = Convert.ToBase64String(byteArray);

    HttpRequestMessage request = new HttpRequestMessage();
    request.Method = HttpMethod.Post;
    request.RequestUri = stunnelUri;
    request.Headers.Authorization = new AuthenticationHeaderValue(scheme, parameter);
    try
    {
        HttpResponseMessage response = await _client.SendAsync(request);

        // This will throw an HttpRequestException if there is a failure above
        response.EnsureSuccessStatusCode();

        // do your stuff here...
        // { ... }

    }
    catch (HttpRequestException)
    {
        // { log your connection / bad request issue. }
    }
    catch (Exception) 
    {
        // I don't recommend this, but since you had it...
        // { handle all other exceptions }
    }
}
Svek
  • 12,350
  • 6
  • 38
  • 69