У меня есть некоторый код в моем проекте ASP.net MVC, который асинхронно отправляет сообщение. При определенных обстоятельствах этот код может потерпеть неудачу и вызвать незапланированное исключение. У меня нет прямого доступа к коду, который генерирует исключение, или коду, который генерирует поток, поэтому я не могу поймать и обработать ошибку там. Я попытался отловить на уровне Application_Error в Global.asax, но эта функция вызывается только для ошибок страницы, а не для фоновых ошибок. Я также попытался перехватить модуль HTTP, реализовав OnUnhandledException, но не смог найти способ перехватить исключение и предотвратить существование там рабочего процесса.
Есть ли способ предотвратить такие смертельные ошибки? Я понимаю, что это серьезные ошибки, и их следует устранять, но я бы предпочел, чтобы они не прерывали рабочий процесс для других пользователей на других страницах.
Более подробная информация:
Диспетчером сообщений является EventStore, и я считаю, что проблема, с которой я столкнулся в этом случае, заключалась в том, что он попытался десериализовать сообщение, в котором реализован ICommand из предыдущей версии NServiceBus. После обновления до последней беты десериализация не удалась. К сожалению, я тупо удалил коммит, который вызывал ошибку, поэтому я не могу полностью продублировать проблему.
Лучший способ, который я нашел для симуляции ошибки, - это
public virtual ActionResult Error()
{
Task.Factory.StartNew(blowup);
return new EmptyResult();
}
private void blowup()
{
throw new Exception("snap");
}
Вы заметите, что исключение привязки генерируется и обрабатывается правильно, не вызывая проблем. Однако, если вы подождете, то тот факт, что мы не наблюдали свойство исключения для Task, в конечном итоге уничтожит все приложение.
Проверено на Кассини, но подобное поведение наблюдается в IIS 7.5.