Обходной путь: Балансировщики нагрузки Windows Azure закрывают неактивные подключения через 60 секунд - PullRequest
2 голосов
/ 07 июля 2011

Простая проблема. У меня есть обработчик ASHX, который генерирует отчет. К сожалению, этот процесс может занять 2 или более минут, и Azure закроет соединение, прежде чем этот обработчик сможет ответить. Зачем? Поскольку соединение слишком долго не используется, оно прерывается.
Итак, мне нужно каким-то образом поддерживать эту связь. Чтобы сделать его немного более сложным, обработчик вызывается из приложения Silverlight, которое будет вызывать обработчик из фрейма текущей веб-страницы или (если он не запущен из браузера) создавать новый экземпляр браузера для вызова обработчика. Моя задача - обойти этот тайм-аут с минимальным количеством кода. Но также, код должен работать точно так же, как и сейчас!

Открытие обработчика в отдельном окне или окне браузера позволяет сохранять отчет в любом месте системы пользователя. Если я скачаю его из кода Silverlight, у меня не будет доступа к записи. Не будет никакого разрешения, предоставленного любому приложению Silverlight, которому необходимо выполнить запись на локальный диск, таким образом можно обойти браузер / фрейм.

1 Ответ

4 голосов
/ 07 июля 2011

Не слишком уверен насчет транспорта HTTP, но вы, безусловно, можете использовать TCP keep-alive на уровне сокетов. Однако затем вам нужно создать прослушиватель сокетов для загрузки содержимого HTTP (способ перебора).

Возможно, есть гораздо более простое решение? Почему бы вам не сделать так, чтобы клиент сделал запрос на генерацию отчета, и чтобы обработчик возвратил подпись SAS (ограниченная по времени, подпись только для чтения) туда, где отчет в конечном итоге будет помещен в хранилище больших двоичных объектов. Это очень быстро и не требует открытого TCP-соединения. Генератор отчетов должен просто создать отчет в файле для загрузки в месте расположения большого двоичного объекта, отправленного клиенту (здесь будет работать любой GUID), вместо того, чтобы передавать его обратно по ответу. Наконец, клиенту просто нужно опросить местоположение, пока он не получит файл. Теперь вы хороши и асинхронны с короткими открытыми соединениями и вам не нужно беспокоиться об этой проблеме тайм-аута TCP. Код для этого гораздо, гораздо менее сложен, чем что-либо для обхода тайм-аута TCP.

...