powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Две ошибки в Web API.
15 сообщений из 15, страница 1 из 1
Две ошибки в Web API.
    #38671199
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class TestController : ApiController
{
    [HttpGet]
    public async Task A1()
    {
        var t1 = Task.Factory.StartNew(() => { throw new Exception("E1"); });
        var t2 = Task.Factory.StartNew(() => { throw new Exception("E2"); });
        await Task.WhenAll(t1, t2);
    }

    [HttpGet]
    public Task A2()
    {
        var t1 = Task.Factory.StartNew(() => { throw new Exception("E1"); });
        var t2 = Task.Factory.StartNew(() => { throw new Exception("E2"); });
        return Task.WhenAll(t1, t2);
    }
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class ApiExceptionHandler : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        var e = actionExecutedContext.Exception;

        // В обоих реализациях, с await и без него, приходит только E1. Где E2? 
        // Где нормальный AggregateException? Кто его съел?
    }
}

Где вторая ошибка? Кто виноват? Что делать?
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38671744
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

надо указывать версию WebAPI, ибо:

Exception filters do not unwrap aggregate exceptions thrown in async actions

Previously, if an async action threw an AggregateException, an exception filter would unwrap the exception, and OnException would get the base exception . In 2.1, the exception filter does not unwrap it, and OnException gets the original AggregateException.

и

Код: c#
1.
public async Task A1()



делать ни к чему. можно просто

Код: c#
1.
public async void A1()
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38671766
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttнадо указывать версию WebAPI, ибо:
Это какая версия?
Код: c#
1.
2.
3.
#region Assembly System.Web.Http.dll, v5.1.0.0
// xxxxx\packages\Microsoft.AspNet.WebApi.Core.5.1.2\lib\net45\System.Web.Http.dll
#endregion


hVosttи

Код: c#
1.
public async Task A1()



делать ни к чему. можно просто

Код: c#
1.
public async void A1()

Зависит от ситуации.
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38671826
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЭто какая версия?
[src c#]
#region Assembly System.Web.Http.dll, v5.1.0.0
// xxxxx\packages\Microsoft.AspNet.WebApi.Core.5.1.2\lib\net45\System.Web.Http.dll
#endregionЭто 2.1, тогда почему не работает? Где-то отключено?
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38671847
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЭто 2.1, тогда почему не работает? Где-то отключено?

что-то я на твой код сразу не внимательно посмотрел.
а с чего ты вообще решил, что в твоём случае должен приходить AggregateException?
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38671874
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КЭто 2.1, тогда почему не работает? Где-то отключено?

что-то я на твой код сразу не внимательно посмотрел.
а с чего ты вообще решил, что в твоём случае должен приходить AggregateException?В A2, который без await, возвращается Task, содержаший две ошибки. Если нет, тогда покажи как правильно.
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38671881
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Task.WhenAll MethodIf any of the supplied tasks completes in a faulted state, the returned task will also complete in a Faulted state, where its exceptions will contain the aggregation of the set of unwrapped exceptions from each of the supplied tasks.
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672045
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВ A2, который без await, возвращается Task, содержаший две ошибки. Если нет, тогда покажи как правильно.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class TestController : ApiController
{
    [HttpGet]
    public async Task A1()
    {
        var t1 = Task.Factory.StartNew(() => { 
                Thread.Sleep(10000000000);
                throw new Exception("E1"); 
        });
        var t2 = Task.Factory.StartNew(() => { throw new Exception("E2"); });
        await Task.WhenAll(t1, t2);
    }
}



как считаешь, когда должен сработать фильтр? и какое значение здесь по-твоему играет WhenAll?
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672063
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttкак считаешь, когда должен сработать фильтр?Через 10000000000 миллисекунд?
hVosttи какое значение здесь по-твоему играет WhenAll?"КогдаВсе"?

Не пойму к чему эти вопросы. Да и лучше рассмотреть метод A2, который без await.
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672069
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНе пойму к чему эти вопросы. Да и лучше рассмотреть метод A2, который без await.

WhenAll не пробрасывает "наружу" исключения, возникшие в подзадачах, так что какая разница?
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672074
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧерез 10000000000 миллисекунд?

проверь
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672081
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, завтра проверим.
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672516
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
        [HttpGet]
        public Task A2()
        {
            var t1 = Task.Factory.StartNew(() => 
            { 
                Thread.Sleep(5000); // <== 5 секунд
                throw new Exception("E1"); 
            });

            var t2 = Task.Factory.StartNew(() => { throw new Exception("E2"); });

            return Task
                .WhenAll(t1, t2)
                .ContinueWith(t =>
                {
                    // Через 5 секунд запускается продолжение.

                    if (t.Exception != null)
                        throw new AggregateException(t.Exception.InnerExceptions); // <== Тут, как и обещалось MSDNом, две ошибки.
                });
        }


В такой реализации в ExceptionFilterAttribute приходит человеческий AggregateException с двумя ошибками. Детский сад какой-то...
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38672643
мсущко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Код: c#
1.
public async Task A1()



делать ни к чему. можно просто

Код: c#
1.
public async void A1()



Учим матчасть.

Сводное описание руководящих принципов асинхронного программирования

Избегайте async void. Отдавайте предпочтение асинхронным методам Task, а не асинхронным void-методам.
...
Рейтинг: 0 / 0
Две ошибки в Web API.
    #38673594
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мсущкоУчим матчасть.

Сводное описание руководящих принципов асинхронного программирования

Избегайте async void. Отдавайте предпочтение асинхронным методам Task, а не асинхронным void-методам.

ну ладно-ладно, давайте вашу зачётку
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Две ошибки в Web API.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]