HttpHandler прослушивает отключение клиента?

Прислушивается ли HttpHandler к отключению от браузера?

Я предполагаю, что «нет», так как он, кажется, в основном/используется только для динамического создания файлов, так с чего бы это?

Но я не могу найти ответ ни в документах, ни в гугле.

Спасибо заранее!

Фон

Я хотел бы «прервать» HttpHandler, потому что в настоящее время я разрешаю огромный экспорт в Excel (~ 150 тыс. строк sql, поэтому ~ 600 тыс. строк html). По причинам почти таким же нелепым, как код, у меня есть запрос, который срабатывает для такого количества строк sql, которые пользователь пытается экспортировать. Как вы понимаете, это занимает очень много времени.

Я думаю, что меня поддерживают рабочие процессы, потому что пользователи, вероятно, расстраиваются из-за задержки и пытаются снова с меньшим результатом. В настоящее время я автоматически очищаю рабочие процессы каждые 30 минут, но я бы предпочел очистку быстрее.

У меня нет времени на очистку sql прямо сейчас, поэтому я хотел бы просто прослушать «прекращение» от клиента и убить обработчик, если оно «прервано».


person Community    schedule 07.02.2013    source источник
comment
@jgauffin Я не слишком уверен, что такое эквивалент .net, но в php есть это php.net/manual/en/function.connection-aborted.php и я предполагаю, что большинство страниц .net имеют то же самое. HttpHandler прослушивает отключение клиента?   -  person    schedule 07.02.2013
comment
Что вы пытаетесь достичь?   -  person Frazell Thomas    schedule 07.02.2013
comment
@FrazellThomas, пожалуйста, посмотрите редактирование   -  person    schedule 07.02.2013
comment
ASP.NET предоставляет Request.IsClientConnected. Во многих случаях это можно использовать с рабочим потоком для создания прерываемого запроса для генератора отчетов черного ящика. Если генератор отчетов можно напрямую изменить, чтобы он работал совместно (т. е. периодически проверять состояние), то он мог бы сам опрашивать это без необходимости во вторичном потоке.   -  person user2864740    schedule 06.06.2015


Ответы (1)


То, чего вы надеетесь достичь, прослушивая разрыв клиентского соединения, на самом деле не поможет решить вашу проблему. Суть вашей проблемы заключается в том, что длительная задача запускается непосредственно в HttpHandler.

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

Единственный способ правильно определить прогресс и выполнять действия во время длительных процессов, таких как этот, — убедиться, что ваш код является многопоточным. Проблема с выполнением этого в ASP.NET для долго выполняющихся процессов заключается в том, что они забирает потоки из пула потоков, необходимые для обслуживания ваших страниц. Это может привести к тому, что ваш веб-сайт будет зависать или отвечать очень медленно, как вы сталкивались с этим.

Я бы порекомендовал написать службу Windows для обработки этих длительных заданий и заставить ее выплевывать результаты в промежуточный каталог. Затем я бы использовал MSMQ или аналогичный, чтобы отправить запрос в сервис для обработки.

В конечном счете, вы хотите получить этот длительный поток за пределами ASP.NET, где вы сможете воспользоваться преимуществами, которые может предложить вам многопоточность. Например, возможность сообщать о прогрессе и прерывать работу, когда это необходимо.

person Frazell Thomas    schedule 08.02.2013
comment
смешной. проверьте, не говорит ли мне "нет" HttpHandlers прослушивание отключений клиентов. Похоже, мне придется смириться с этим и исправить sql. спасибо фраз! - person ; 08.02.2013
comment
Использование new Thread не будет использовать пул потоков - это жизнеспособное решение (наряду с опросом thread-Join и IsClientConnected и неприятным несовместным потоком-Abort), позволяющим прервать длительные генерации отчетов. Это правильный путь? Возможно, 1) Прервать неприемлемо, и его следует использовать только тогда, когда совместный метод невозможен, и 2) использовать [n существующую] очередь отчетов ... но возможно реализовать достаточно OK. В IIS 7.5 Response.IsClientConnected работает должным образом при использовании в режиме опроса. - person user2864740; 06.06.2015
comment
И если рабочий поток игнорирует/заполняет исключение Abort (что может быть), то это не хуже (при условии, что ресурсы правильно размещены с помощью using и т. д.), чем наличие неотмененных поколений, поскольку в обоих этих случаях работа должна выполняться до завершения . (Но если исключение Abort заполняется или код генерации отчета пропускает ресурсы, как решето, тогда возникают другие проблемы.) - person user2864740; 06.06.2015