Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Две ошибки в Web API. / 15 сообщений из 15, страница 1 из 1
17.06.2014, 08:13
    #38671199
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Код: 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
17.06.2014, 13:47
    #38671744
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Алексей К,

надо указывать версию 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
17.06.2014, 13:57
    #38671766
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
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
17.06.2014, 14:34
    #38671826
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Алексей КЭто какая версия?
[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
17.06.2014, 14:46
    #38671847
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Алексей КЭто 2.1, тогда почему не работает? Где-то отключено?

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

что-то я на твой код сразу не внимательно посмотрел.
а с чего ты вообще решил, что в твоём случае должен приходить AggregateException?В A2, который без await, возвращается Task, содержаший две ошибки. Если нет, тогда покажи как правильно.
...
Рейтинг: 0 / 0
17.06.2014, 15:03
    #38671881
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
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
17.06.2014, 16:52
    #38672045
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Алексей КВ 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
17.06.2014, 16:58
    #38672063
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
hVosttкак считаешь, когда должен сработать фильтр?Через 10000000000 миллисекунд?
hVosttи какое значение здесь по-твоему играет WhenAll?"КогдаВсе"?

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

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

проверь
...
Рейтинг: 0 / 0
17.06.2014, 17:08
    #38672081
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Ладно, завтра проверим.
...
Рейтинг: 0 / 0
18.06.2014, 07:49
    #38672516
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
Код: 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
18.06.2014, 10:48
    #38672643
мсущко
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две ошибки в Web API.
hVostt
Код: c#
1.
public async Task A1()



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

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



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

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

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

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

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

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


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