Отлов исключений, генерируемых в асинхронном веб-сервисе, завершил обработчик событий - PullRequest
1 голос
/ 12 февраля 2010

Представьте себе веб-сервис с методом, который возвращает объект Customer, который принимает идентификатор клиента в качестве параметра, т.е.

[WebMethod]
Customer GetCustomer(string customerId)

Теперь представьте, что вы пишете приложение ASP.NET и создали прокси-сервер для службы с асинхронными операциями. Вы создаете экземпляр службы, проводной service.GetCustomerCompleted для вашего обработчика OnGetCustomerCompleted и вызываете service.GetCustomerAsync ("12345").

В OnGetCustomerCompleted вы применяете логику, чтобы обнаружить, что ни один клиент не был найден, и выбрасываете пользовательское исключение, или вы хотите выбросить исключение, найденное в e.Error, например ::1006*.

void OnGetCustomerCompleted(object sender, GetCustomerCompletedEventArgs e)
{
    if (e.Error != null)
        throw new ApplicationException("GetCustomer failed", e.Error);

    if (String.IsNullOrEmpty(e.Result.FirstName) && String.IsNullOrEmpty(e.Result.LastName))
            throw new CustomerNotFoundException();
}

(я пропустил биты кода, который устанавливает объект Customer и сохраняет его при вызовах.)

Вы запускаете вызов GetCustomerAsync в Page_Load и ожидаете получить результат в обработчике, связанном с Page.OnPreRenderComplete.

Мой вопрос: как вы ловите исключение на своей странице? Я знаю, что вы можете поймать его с помощью ApplicationError Global.asax, но что, если вы не хотите уходить со своей страницы?

1 Ответ

1 голос
/ 12 февраля 2010

Вы не хотите создавать исключение из обработчика событий. Там нет ничего, чтобы поймать исключение!

Если вы видите исключение, установите флажок на странице. Если вам нужен обработчик OnPreRenderComplete для использования сведений об исключении, флаг может быть самим исключением. Если установлено значение null, исключений не было, в противном случае это исключение, которое вы нашли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...