async прерывание треда
От: -Cheese-  
Дата: 19.08.21 13:41
Оценка:
Всем привет.
Сталкивался ли кто-нибудь с проблемой в стандартном asp.net приложении, когда внутри асинхронного метода контроллера при асинхронном вычитывании тела запроса поток внезапно прерывается без исключения.

Т.е. есть что-то типа
....
public class MyController : ControllerBase {
....
  [HttpPost]
        [Route("somepost")]
        public async Task<string> PostRequest() {
            HttpContextLocal context = new HttpContextLocal(HttpContext); 
            context.SetBody();
            log.Info($"Body length after read: {context.body?.Length}");    
            return await Handler.Application_POST(context);
        }

....
}
....

public class HttpContextLocal{
.....
  public async void SetBody() {
            try {
                log.Info($"Body => Position: {context.Request.Body.Position}, CanRead: {context.Request.Body.CanRead}");
                var bodyReader = context.Request.BodyReader;
                ReadResult readResult;
                int cnt=0;
                while (true) {
                    readResult = await bodyReader.ReadAsync();
                    log.Info($"Read step {++cnt} => IsCompleted: {readResult.IsCompleted}, IsCanceled: {readResult.IsCanceled}");
                    if (readResult.IsCompleted || readResult.IsCanceled)
                        break;
                    log.Info($"Buffer length: {readResult.Buffer.Length}");
                    bodyReader.AdvanceTo(readResult.Buffer.Start, readResult.Buffer.End);
                }

                body = Encoding.UTF8.GetString(readResult.Buffer.ToArray());
                log.Info($"Body read ok => length: {body?.Length}");
              ....
            } catch (Exception ex) {
              log.Error(ex);
                ......
            } 
        }
}


В некоторых ситуациях, прибольшом теле запроса и интенсивной нагрузке на хост вижу в логе примерно вот такую картину...

Body => Position: 0, CanRead: True
Read step 1 => IsCompleted: False, IsCanceled: False
Buffer length: 4096
Read step 2 => IsCompleted: False, IsCanceled: False
Buffer length: 8192
Read step 3 => IsCompleted: False, IsCanceled: False
Buffer length: 11284
Body length after read: 0


Записи

Body read ok => length:

в логе нет и переменная context.body в методе контроллера пустая, исключния так же не было — такое впечатление, что внутри цикла метода SetBody просто поток прекратил существование
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.