У меня есть следующий фрагмент кода в конечной точке API .NET 6, где запрос находится в цикле, пока не будет найдено жизнеспособное условие для возврата:
while (true)
{
try
{
cancellationToken.ThrowIfCancellationRequested();
}
catch
{
_unitOfWork.ResetContextState();
if (cancellationToken.IsCancellationRequested)
{
}
}
}
Переменная CancellationToken — это объект типа CancellationToken из пакета System.Threading, и я получаю объект непосредственно в API-контроллере. Объект отправляется и управляется непосредственно .NET.
При работе на локальном хосте, если я отменяю запрос, код входит в блок catch, а затем в оператор if (cancellationToken.IsCancellationRequested). Однако, когда API размещается в службе приложений Azure Linux, при отмене запроса тот же поток не учитывается, вместо этого запрос резко завершается. кто-нибудь знает, почему это произошло?
Заранее спасибо всем!
Я предполагаю, что разница в том, что в Службе приложений Azure ваше приложение находится за балансировщиком нагрузки, работающим с IIS в Windows, на самом деле не открыто, и похоже, что событие не перенаправляется:
Токен отмены не срабатывает при использовании IIS
Эта проблема с github старая, может быть что-то можно как-то настроить? Как это, совершенно другая проблема, но все еще изменяет поведение службы приложений Azure по умолчанию в отношении балансировщиков нагрузки Azure.
Кажется, что часть IIS/Windows больше не актуальна: https://devblogs.microsoft.com/dotnet/bringing-kestrel-and-yarp-to-azure-app-services/
тогда мой ответ удовлетворяет ваш вопрос о знании «почему»?
Понял, спасибо за объяснение, мне удалось обойти ситуацию с помощью вебсокета, несмотря на то, что конечная точка не является двусторонним соединением, это послужило решению проблемы.