У меня есть фрагмент кода, который вызывает другой 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
лучший @IkhtesamAfrin, моя проблема не в том, что время ожидания моей функции, а в том, что HTTP-запрос, который я делаю внутри моей функции, истекает по времени, когда моя функцияTimeout установлена на 1 час.
Какой у вас план функционального приложения?
@IkhtesamAfrin мой тарифный план — это план обслуживания приложений
Можете ли вы попробовать использовать client.Timeout=Timeout.InfiniteTimeSpan;





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

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);
}
}
}
Вы можете изменить долговечную функцию в соответствии с вашими требованиями.
Если вашей функции требуется время для ответа, используйте
"functionTimeout": "00:30:00",в файле host.json приложения-функции. Если ваше приложение-функция находится в плане обслуживания приложений, вы можете использовать опциюAlways on, чтобы игнорировать тайм-аут.