Как обрабатываются исключения тайм-аута SQL Server в постах Ajax? - PullRequest
3 голосов
/ 29 октября 2011

У меня есть постбэк Ajax, в котором я делаю запрос SQL Server. Структура слишком сложна для размещения здесь. Если у меня customErrors = Off ", то ошибка возвращается клиенту в ответе HTTP, откуда я его вынимаю и показываю пользователю соответствующие вещи:

114 | ошибка | 500 | Истекло время ожидания. Время ожидания истекло до завершение операции или сервер не отвечает. |

У меня есть другие "исключения приложения", которые я также ловлю на клиенте таким же образом. Все это бесплатно: asp.net помещает вышеуказанный материал в ответ http без моей помощи.

Затем я включаю customErrors = On, потому что в других случаях я не хочу показывать пользователям полный дамп стека. На этом этапе все мои исключения, как указано выше, удаляются из сообщения, поэтому они становятся просто:

0 | ошибка | 500 ||

Что вполне разумно. Затем я добавляю некоторую обработку исключений в свой код обратной передачи Ajax, чтобы перехватить ошибки приложения ... и затем я явно записываю данные об исключениях, которые мне нужны, обратно клиенту:

39 | error | 202 | У вас нет доступа к этой записи. |

Это все хорошо работает.

В этом случае проблема связана с одним конкретным типом исключения - таймауты базы данных SQL Server. Похоже, что это общие «необработанные исключения», за исключением исключения времени ожидания базы данных. Подвох в том, что это исключение совсем не касается моего обработчика - я не могу найти его и сообщить, что я хочу!

Глядя на трассировки исключений, трасса тайм-аута, конечно, длиннее моей трассировки «у вас нет доступа», потому что она связывает несколько вещей, прежде чем она достигнет моего (принудительного для целей тестирования) таймаута. Глядя только на последние биты двух трасс, я получаю (приложение Eception):

System.Web.HttpUnhandledException (0x80004005): Exception of type System.Web.HttpUnhandledException' was thrown. ---> System.ApplicationException: You do not have access to this record.
       at pages_***.HideEventLists(Boolean becauseNotAccessible) in *
       at pages_**.AjaxTabLoad(Object sender, AjaxTabEventArgs e) in *
       at userControls_tabs.panel_Load(Object sender, EventArgs e) in *
       at System.Web.UI.Control.OnLoad(EventArgs e)

Versus (время ожидания SQL Server):

System.Web.HttpUnhandledException (0x80004005): Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Data.SqlClient.SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)

Итак, мне интересно, где именно я должен перехватывать исключение тайм-аута SQL Server? Я не хочу обернуть каждый доступ к базе данных своим собственным обработчиком! Что я могу сделать, чтобы передать это исключение так же, как исключение моего приложения?

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