public async Task <T> SendAsync <T>(string endpoint, BaseParameters parameters = null) { if (endpoint[0] != '/') { throw new ArgumentException($"{nameof(endpoint)} must start with a '/'"); } await _semaphore.WaitAsync().ConfigureAwait(false); await _ratelimiter.WaitAsync().ConfigureAwait(false); parameters = parameters ?? new EmptyParameters(); var request = new HttpRequestMessage(HttpMethod.Get, endpoint) { Content = new StringContent(parameters.BuildContent()) }; var sw = new Stopwatch(); sw.Start(); try { using (var response = await _httpClient.SendAsync(request).ConfigureAwait(false)) { _semaphore.Release(); sw.Stop(); var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); //await _client.InternalLogReceivedAsync($"GET {endpoint} {sw.ElapsedMilliseconds}ms"); if (response.IsSuccessStatusCode) { return(JsonConvert.DeserializeObject <T>(content)); } var model = JsonConvert.DeserializeObject <ErrorModel>(content); var error = new ErrorMessage(model); await _client.InternalErrorReceivedAsync(error); return(default);