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