ProgressPercentage основан на ContentLength, возвращенном в заголовке ответа. Если ответ не знает, насколько большой будет загрузка, когда он собирает заголовок, вы не сможете получить прогресс.
Если бы это был просто файл, возвращенный IIS, IIS получил бы размер файла из файловой системы и установил для вас заголовок. Если ответ является динамическим и вписывается в буфер, длина ответа может быть установлена. Однако я вполне уверен, что размер буфера по умолчанию составляет менее 10 МБ, поэтому заголовок ответа отправляется обратно клиенту до того, как станет известна длина ответа.
В Asp.Net вы бы это сделали (в зависимости от вашей платформы это зависит от вашей платформы) ...
Response.AddHeader("Content-Length", "10485760");