Как правильно отменить привязку модели?C#

Место общения программистов C#
Ответить
Anonymous
 Как правильно отменить привязку модели?

Сообщение Anonymous »

Я пытаюсь отладить давнюю проблему в одном из наших веб-сервисов.
Проблема особенно проявляется, когда под нагрузкой наши экземпляры начинают выдавать исключение:

Код: Выделить всё

Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Unexpected end of request content.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1ContentLengthMessageBody.ReadAsyncInternal(CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpRequestStream.ReadAsyncInternal(Memory`1 destination, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource.GetResult(Int16 token)
at System.Text.Json.Serialization.ReadBufferState.ReadFromStreamAsync(Stream utf8Json, CancellationToken cancellationToken, Boolean fillBuffer)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.DeserializeAsync(Stream utf8Json, CancellationToken cancellationToken)
at System.Text.Json.Serialization.Metadata.JsonTypeInfo`1.DeserializeAsObjectAsync(Stream utf8Json, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.BindModelAsync(ModelBindingContext bindingContext)
На самом деле создание исключения — это нормально, и мы хотим, чтобы оно соответствовало токену таймаута, который мы отправляем (в настоящее время он установлен на 1 минуту от нашего балансировщика нагрузки istio). У нас есть трассировка и благодаря этому я видел, что некоторые запросы занимают необычно много времени (иногда до 10-20 минут) даже до достижения контроллера (я предполагаю, что это происходит во время привязки модели)
Я вижу в трассировка стека на самом деле вызывает методы с параметрами canceltoken, но мне интересно, есть ли проблема, из-за которой служба не учитывает отмену?
Я создал специальную оболочку вокруг BodyModelBinder и добавили к нему логику отмены ниже, и это уменьшило количество длительных запросов, и мы возвращаем клиенту ответ по тайм-ауту, но (из-за характера задач в .net) привязка модели все еще пытается завершиться в фоновом режиме, сохраняет использует ресурсы и в конечном итоге выходит из строя.
Мы используем .net8 на k8s 1.30, и перед этой службой стоит балансировщик нагрузки istio.
Я хотел спросить, есть ли лучший/правильный способ отменить запрос еще до того, как он достигнет контроллера?
Заранее спасибо,
Пользовательский код отмены:

Код: Выделить всё

public async Task BindModelAsync(ModelBindingContext bindingContext)
{
var token = CancellationTokenSource.CreateLinkedTokenSource(bindingContext.HttpContext.RequestAborted);
var task = _actualModelBinder.BindModelAsync(bindingContext);
var delay = Task.Delay(TimeSpan.FromSeconds(5), token.Token);
if (await Task.WhenAny(delay, task) == task)
{
// Task completed within timeout.
// Consider that the task may have faulted or been canceled.
// We re-await the task so that any exceptions/cancellation is rethrown.
token.Cancel();
await task;
}
else if (bindingContext.HttpContext.RequestAborted.IsCancellationRequested)
{
throw new OperationCanceledException("Request cancelled.");
}
else
{
throw new TimeoutException("Model binding timed out.");
}
}
Изменить: я добавил, как я вижу эту проблему в наших диапазонах ниже, вы можете увидеть событие после 40 секунд, что является первым, что я делаю в контроллере (он говорит: «запрос подтвержден» '), поэтому этому запросу потребовалось более 40 секунд, чтобы достичь контроллера
Изображение


Подробнее здесь: https://stackoverflow.com/questions/791 ... g-properly
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»