示例#1
0
        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);