روش صحیح کار با HttpClient در ASP.NET Core 2x
نویسنده: وحید نصیری
تاریخ: ۱۳۹۸/۰۱/۲۴ ۱۴:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class GitHubClient
{
public IReadOnlyCollection<GitHubRepositoryDto> GetRepositories()
{
using (var httpClient = new HttpClient{BaseAddress = new Uri(GitHubConstants.ApiBaseUrl)})
{
var result = httpClient.GetStringAsync(GitHubConstants.RepositoriesPath).Result;
return JsonConvert.DeserializeObject<List<GitHubRepositoryDto>>(result);
}
}
} public class GitHubClient : IGitHubClient
{
public async Task<IReadOnlyCollection<GitHubRepositoryDto>> GetRepositories()
{
using (var httpClient = new HttpClient { BaseAddress = new Uri(GitHubConstants.ApiBaseUrl) })
{
var result = await httpClient.GetStringAsync(GitHubConstants.RepositoriesPath);
return JsonConvert.DeserializeObject<List<GitHubRepositoryDto>>(result);
}
}
} public class GitHubClient : IGitHubClient
{
private readonly HttpClient _httpClient;
public GitHubClient()
{
_httpClient = new HttpClient { BaseAddress = new Uri(GitHubConstants.ApiBaseUrl) };
}
public async Task<IReadOnlyCollection<GitHubRepositoryDto>> GetRepositories()
{
var result = await _httpClient.GetStringAsync(GitHubConstants.RepositoriesPath).ConfigureAwait(false);
return JsonConvert.DeserializeObject<List<GitHubRepositoryDto>>(result);
}
} services.AddSingleton<GitHubClient>();
public class GitHubClient : IGitHubClient
{
private readonly IHttpClientFactory _httpClientFactory;
public GitHubClient(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory ?? throw new ArgumentNullException(nameof(httpClientFactory));
}
public async Task<IReadOnlyCollection<GitHubRepositoryDto>> GetRepositories()
{
var httpClient = _httpClientFactory.CreateClient("GitHub");
var result = await httpClient.GetStringAsync(GitHubConstants.RepositoriesPath).ConfigureAwait(false);
return JsonConvert.DeserializeObject<List<GitHubRepositoryDto>>(result);
}
} services.AddHttpClient("GitHub", x => { x.BaseAddress = new Uri(GitHubConstants.ApiBaseUrl); });
services.AddSingleton<GitHubClient>(); public class GitHubClient : IGitHubClient
{
private readonly HttpClient _httpClient;
public GitHubClient(HttpClient httpClient)
{
_httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
}
public async Task<IReadOnlyCollection<GitHubRepositoryDto>> GetRepositories()
{
var result = await _httpClient.GetStringAsync(GitHubConstants.RepositoriesPath).ConfigureAwait(false);
return JsonConvert.DeserializeObject<List<GitHubRepositoryDto>>(result);
}
} services.AddHttpClient<GitHubClient>(x => { x.BaseAddress = new Uri(GitHubConstants.ApiBaseUrl); }); public class GitHubClientFactory
{
private readonly IServiceProvider _serviceProvider;
public GitHubClientFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public GitHubClient Create()
{
return _serviceProvider.GetRequiredService<GitHubClient>();
}
} services.AddHttpClient<GitHubClient>(x => { x.BaseAddress = new Uri(GitHubConstants.ApiBaseUrl); });
services.AddSingleton<GitHubClientFactory>(); public class GitHubClient : IGitHubClient
{
private readonly HttpClient _httpClient;
private readonly JsonSerializer _jsonSerializer;
public GitHubClient(HttpClient httpClient, JsonSerializer jsonSerializer)
{
_httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
_jsonSerializer = jsonSerializer ?? throw new ArgumentNullException(nameof(jsonSerializer));
}
public async Task<IReadOnlyCollection<GitHubRepositoryDto>> GetRepositories()
{
var request = CreateRequest();
var result = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead);
using (var responseStream = await result.Content.ReadAsStreamAsync())
{
using (var streamReader = new StreamReader(responseStream))
using (var jsonTextReader = new JsonTextReader(streamReader))
{
return _jsonSerializer.Deserialize<List<GitHubRepositoryDto>>(jsonTextReader);
}
}
}
private static HttpRequestMessage CreateRequest()
{
return new HttpRequestMessage(HttpMethod.Get, GitHubConstants.RepositoriesPath);
}
} services.AddHttpClient<GitHubClient>(x => { x.BaseAddress = new Uri(GitHubConstants.ApiBaseUrl); });
services.AddSingleton<GitHubClientFactory>();
services.AddSingleton<JsonSerializer>(); var result = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseContentRead);
var result = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
services.AddHttpClient("GitHub", a =>
{
a.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
}); services.AddHttpClient("Github", a =>
{
a.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
}).ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler
{
Proxy = new WebProxy("192.168.20.21", 3128),
UseProxy = true
}); services.AddHttpClient("GitHub", x => { x.BaseAddress = new Uri(GitHubConstants.ApiBaseUrl); }); services.AddHttpClient("GitHub", x => { x.BaseAddress = new Uri(GitHubConstants.ApiBaseUrl); });
services.AddHttpClient("Facebook", x => { x.BaseAddress = new Uri(""); });
services.AddHttpClient("whatsapp", x => { x.BaseAddress = new Uri(""); });