ASP.NET Core Web API — как добавить время ожидания подключения к HttpClient

Я реализую 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-секундный тайм-аут соединения.

Как мне этого добиться? А также, где я могу применить это?

Спасибо

В чем смысл HttpProxyClient? Если вы хотите смоделировать HttpClient, вы можете передать макет HttpClientHandler его конструктору, который возвращает все, что вы хотите. То, что вы опубликовали, является очень подробным способом сделать то, что делают PostAsync или GetAsync. Хуже того, это не позволяет вам настраивать тайм-ауты, повторные попытки и аутентификацию с помощью HttpClientFactory.

Panagiotis Kanavos 22.02.2023 13:15

Вы можете использовать HttpClientFactory, DI и типизированные Http-клиенты для регистрации фактических служб, которые получают экземпляр HttpClient, настроенный так, как вы хотите, перерабатываемый HttpClientFactory по мере необходимости, с использованием политик повторных попыток, указанных через Polly.

Panagiotis Kanavos 22.02.2023 13:18
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Запуск PHP на IIS без использования программы установки веб-платформы
Запуск PHP на IIS без использования программы установки веб-платформы
Установщик веб-платформы, предлагаемый компанией Microsoft, перестанет работать 31 декабря 2022 года. Его закрытие привело к тому, что мы не можем...
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Настройка шаблона Metronic с помощью Webpack и Gulp
Настройка шаблона Metronic с помощью Webpack и Gulp
Я пишу эту статью, чтобы поделиться тем, как настроить макет Metronic с помощью Sass, поскольку Metronic предоставляет так много документации, и они...
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте это (при создании 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"

Другие вопросы по теме