Я реализую HttpClient в своем приложении Asp.NET Core-6. У меня есть этот код, как показано ниже.
HttpProxyClient
public interface IHttpProxyClient
{
Task<HttpTxnResponse> GetRequest(string resourcePath, string data, string mediaType, IDictionary<string, string> headerInfo);
Task<HttpTxnResponse> PostRequest(string resourcePath, string data, string mediaType, IDictionary<string, string> headerInfo);
}
public class HttpProxyClient : IHttpProxyClient
{
private readonly ILogger<HttpProxyClient> _logger;
private static readonly HttpClient client = new HttpClient();
public HttpProxyClient(ILogger<HttpProxyClient> logger)
{
_logger = logger;
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task<HttpTxnResponse> PostRequest(string resourcePath, string data, string mediaType, IDictionary<string, string> headerInfo)
{
HttpTxnResponse responseFromServiceCall = new HttpTxnResponse();
try
{
var request = new HttpRequestMessage(HttpMethod.Post, resourcePath);
if (headerInfo != null)
{
foreach (var header in headerInfo)
{
request.Headers.Add($"{header.Key}", $"{header.Value}");
}
}
StringContent content = new StringContent(data, Encoding.UTF8, mediaType);
request.Content = content;
var result = await client.SendAsync(request);
responseFromServiceCall.StatusCode = result.StatusCode.ToString();
responseFromServiceCall.ResponseContent = await result.Content.ReadAsStringAsync();
return responseFromServiceCall;
}
catch (Exception ex)
{
responseFromServiceCall.StatusCode = HttpStatusCode.InternalServerError.ToString();
_logger.LogError(ex.Message);
}
return responseFromServiceCall;
}
public async Task<HttpTxnResponse> GetRequest(string resourcePath, string data, string mediaType, IDictionary<string, string> headerInfo)
{
HttpTxnResponse responseFromServiceCall = new HttpTxnResponse();
try
{
string token = string.Empty;
if (headerInfo != null)
{
foreach (var header in headerInfo)
{
token = header.Value;
}
}
client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", token);
var result = await client.GetAsync(resourcePath);
responseFromServiceCall.StatusCode = result.StatusCode.ToString();
responseFromServiceCall.ResponseContent = await result.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
responseFromServiceCall.StatusCode = HttpStatusCode.InternalServerError.ToString();
_logger.LogError(ex.Message);
}
return responseFromServiceCall;
}
}
Затем ниже у меня есть код для реализации, где я вызвал _httpProxyClient. Это также показано ниже.
Выполнение:
var httpResp = await _httpProxyClient.PostRequest(remoteUrl, payload, "application/json", headerInfo);
Я хочу добавить 30-секундный тайм-аут соединения.
Как мне этого добиться? А также, где я могу применить это?
Спасибо
Вы можете использовать HttpClientFactory, DI и типизированные Http-клиенты для регистрации фактических служб, которые получают экземпляр HttpClient, настроенный так, как вы хотите, перерабатываемый HttpClientFactory по мере необходимости, с использованием политик повторных попыток, указанных через Polly.
Попробуйте это (при создании httpclient);
private static readonly HttpClient client = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
Или отдельной строкой;
private static readonly HttpClient client = new HttpClient();
client.Timeout = TimeSpan.FromSeconds(30);
Или вы можете посмотреть "CancellationToken"
В чем смысл HttpProxyClient? Если вы хотите смоделировать HttpClient, вы можете передать макет HttpClientHandler его конструктору, который возвращает все, что вы хотите. То, что вы опубликовали, является очень подробным способом сделать то, что делают PostAsync или GetAsync. Хуже того, это не позволяет вам настраивать тайм-ауты, повторные попытки и аутентификацию с помощью HttpClientFactory.