Для асинхронного контроллера:
public class MyController : AsyncController
{
[NoAsyncTimeout]
public void MyActionAsync() { ... }
public void MyActionCompleted() { ... }
}
Предположим, что MyActionAsync
запускает процесс, который занимает несколько минут. Если теперь пользователь переходит к действию MyAction
, браузер будет ждать с открытием соединения. Если пользователь закрывает свой браузер, соединение закрывается. Можно ли обнаружить, когда это происходит на сервере (желательно внутри контроллера)? Если да, то как? Я попытался переопределить OnException
, но это никогда не срабатывает в этом сценарии.
Примечание.. Я ценю полезные ответы ниже, но ключевым аспектом этого вопроса является то, что я использую AsyncController
. Это означает, что HTTP-запросы все еще открыты (они долговечны, как COMET или BOSH), что означает его соединение в прямом соке. Почему сервер не может быть уведомлен о завершении этого прямого соединения (т.е. "Соединение reset через одноранговую сеть", пакет TCP RST)?