Ядро asp.net не может сбросить асинхронное исключение - PullRequest
0 голосов
/ 18 октября 2018

У меня проблема с перебрасыванием исключения в ядре asp.net.

Протестировано под .net core 2.1.402

    [HttpPost("processmessage")]
    public async Task<ActionResult> Process(JObject obj, CancellationToken token)
    {
        var t = Task.Run(() => { return Task.FromException(new Exception("ab")); });

        try
        {
            await t;
        }
        catch (Exception ex)
        {
            throw;
            var x = 0;
        }
        return Ok();
    }

Ожидаемый результат: исключение должно быть переброшенои обрабатывается фильтром исключений ядра asp.net \ middleware и т. д.

Текущий результат: я могу перехватить исключение внутри перехвата перехвата, но исключение не вызывается повторно на уровне asp.net.Запрос застрял (в почтальоне) на несколько минут.

Я тоже пробовал:

    [HttpPost("processmessage")]
    public async Task<ActionResult> Process(JObject obj, CancellationToken token)
    {
        var t = Task.Run(() => { throw new Exception("ab"); });

        try
        {
            await t;
        }
        catch (Exception ex)
        {
            throw;
        }
        return Ok();
    }

И этот код работает совершенно так же, как и предыдущий.

ЕдинственныйРабочее решение для меня:

    [HttpPost("processmessage")]
    public async Task<ActionResult> Process(JObject obj, CancellationToken token)
    {
        var t = Task.Run(() => { throw new Exception("ab"); });

        try
        {
            t.Wait(TimeSpan.FromSeconds(10));
        }
        catch (Exception ex)
        {
            throw;
        }
        return Ok();
    }

Кто-нибудь может объяснить, почему я не могу повторно выбросить исключение в первых двух сценариях?Ожидается ли такое поведение или это ошибка в asp.net?

=== Обновление 10.18

Пример : https://github.com/skynet2/net-core-debugger-issue/blob/master/WebApplication2/Controllers/ValuesController.cs

Через некоторое времяДополнительные исследования позволили мне найти причину такого странного поведения.В моем случае проблема заключается в DataServerExceptionFilter, а причина - Debugger.Break () ;

Я ставлю точку останова на каждой строке в фильтре исключений, и странная вещь заключается в том, что точка останова до Debugger.Break работает , но после Dubbuger.Break вся обработка останавливается ,и это не работает для асинхронного, но работает для .Wait ()

...