Тайм-аут HttpClient внутри AzureFunction

У меня есть фрагмент кода, который вызывает другой API внутри функций Azure. этот запрос занимает некоторое время, если он занимает больше 4 минут, тайм-аут клиента, а не самих функций. Вот мой код

Код в program.cs

 {
     client.BaseAddress = new Uri(Environment.GetEnvironmentVariable("MONO_CHAT_URL") ?? throw new NullReferenceException("Mono chat url cannot be null"));
     client.DefaultRequestHeaders.Add("keyname", Environment.GetEnvironmentVariable("API_KEY") ?? throw new NullReferenceException("API Key cannot be null"));
     client.Timeout = TimeSpan.FromSeconds(9999);
 });`

Код в сервисе

  {
      try
      {
          _logger.LogInformation("Request is send to {BaseUrl}/{Path}", client.BaseAddress, path);
          var response = await client.GetFromJsonAsync<T>(path);
          if (response != null)
          {
              _logger.LogInformation("Response recieved for {path}", path);
              if (response.GetType() != typeof(T))
              {
                  _logger.LogError("Response with url {BaseUrl}/{Path} is not the correct type", client.BaseAddress , path);
              }
          }
          else
          {
              _logger.LogError("Response with url {BaseUrl}/{Path} is empty", client.BaseAddress, path);
          }
          return response;
      }
      catch (Exception e)
      {
          _logger.LogError(e, "Could not get data for {path}", path);
          throw e;
      }

  }

Локально это работает нормально, потому что он получает тайм-аут клиента из файла program.cs, но у меня такое ощущение, что при развертывании в Azure функция Azure устанавливает собственный тайм-аут клиента на основе этого RequestTimout

Если вашей функции требуется время для ответа, используйте "functionTimeout": "00:30:00", в файле host.json приложения-функции. Если ваше приложение-функция находится в плане обслуживания приложений, вы можете использовать опцию Always on, чтобы игнорировать тайм-аут.

Ikhtesam Afrin 27.05.2024 11:11

лучший @IkhtesamAfrin, моя проблема не в том, что время ожидания моей функции, а в том, что HTTP-запрос, который я делаю внутри моей функции, истекает по времени, когда моя функцияTimeout установлена ​​на 1 час.

Mathijs Glazema 27.05.2024 11:19

Какой у вас план функционального приложения?

Ikhtesam Afrin 27.05.2024 11:48

@IkhtesamAfrin мой тарифный план — это план обслуживания приложений

Mathijs Glazema 27.05.2024 12:09

Можете ли вы попробовать использовать client.Timeout=Timeout.InfiniteTimeSpan;

Ikhtesam Afrin 27.05.2024 12:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Тайм-аут HttpClient истекает через 230 секунд, а также тайм-аут, если вы установили его больше 230 секунд из-за следующего ограничения балансировщика нагрузки Azure.

  • Если ответ вашего API занимает более 4 минут, вы можете рассмотреть возможность использования Надежной функции Azure.
  • Я вызываю функцию в устойчивой функции Azure, ответ которой занимает 5 минут.
using System;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using Microsoft.Azure.WebJobs.Extensions.DurableTask;

namespace _78538129_1
{
    public static class DurableFunction
    {

        [FunctionName("DurableFunction")]
        public static async Task RunOrchestrator(
            [OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            // Call Function1
            await context.CallActivityAsync("ActivityFunction", null);
        }

        [FunctionName("ActivityFunction")]
        public static async Task CallFunction1([ActivityTrigger] object input, ILogger log)
        {
            var httpClient = new HttpClient();
            httpClient.Timeout = TimeSpan.FromMinutes(7);
            var response = await httpClient.GetAsync("https://****.azurewebsites.net/api/Function1");

            if (!response.IsSuccessStatusCode)
            {
                throw new Exception($"Function1 failed with status code {response.StatusCode}");
            }

            log.LogInformation("Function1 called successfully.");
        }

        [FunctionName("HttpStart_DurableFunction")]
        public static async Task<HttpResponseMessage> HttpStart(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestMessage req,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log)
        {
            // Function input comes from the request content.
            string instanceId = await starter.StartNewAsync("DurableFunction", null);

            log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

            return starter.CreateCheckStatusResponse(req, instanceId);
        }
    }
}

Вы можете изменить долговечную функцию в соответствии с вашими требованиями.

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

Приложение-функция Azure, использующее Python: проблема при анализе строки JSON в теле запроса
Невозможно распечатать/использовать выходные данные сообщения служебной шины Azure, хранящиеся как System.Collections.Hashtable
Изолированная функция Azure Durable Entity никогда не выполняется
Невозможно отладить функцию Azure в Visual Studio 2022
Развертывание конфигураций приложений-функций Azure через Azure DevOps Pipeline
Попытка отправить сообщение из функции Azure в Azure SignalR завершилась неудачно, ошибка 403 запрещена
Журналы дважды регистрируются в аналитике приложений при использовании Serilog в приложении Azure Function .NET 6
Функции Azure аварийно завершают работу с ошибкой ModuleNotFoundError при сборке с помощью конвейера Azure DevOps, но работают нормально при развертывании вручную
Приложение функции триггера служебной шины Azure перестает отслеживать свою очередь
Могу ли я добавить новые значения среды в приложение-функцию Azure через конвейер Azure Dev Ops?