Неточный индикатор выполнения при загрузке больших файлов с помощью ASP.NET и Uploadify?

У меня есть веб-приложение ASP.NET (использующее WebForms), и я использую Uploadify для загрузки больших файлов. Это делается путем публикации файла в HttpHandler.

Пример кода (упрощенный для демонстрационных целей):

$(".uploadify").uploadify({
    'uploader': '/uploadify/uploadify.swf',
    'script': 'SaveUploadedFile.ashx',
    'cancelImg': '/uploadify/cancel.png',
    'queueID': 'fileQueue',
    'auto': true,
    'multi': false,
    'method': 'post',
    onSelect: function(e, queueId, file) {
        alert(file.name + " selected");
    },
    onComplete: function(e, queueId, file, response, data) {
        alert("complete: " + response);
    },
    onCancel: function(e, queueId, file, data) {
        alert("cancel");
    }
});

HttpHandler, который получает файл, довольно прост:

public void ProcessRequest(HttpContext context)
{
    Debug.WriteLine("Save file");

    if (context.Request.Files.Count == 0)
        throw new SystemException("No files uploaded");

    // Get the file
    HttpPostedFile file = context.Request.Files.Get(0);
    Debug.WriteLine("Got file: " + file.FileName + ", Length: " + file.ContentLength);

    // Save it
    string guid = Guid.NewGuid().ToString();
    string path = Path.Combine(Path.GetTempPath(), guid + ".tmp");
    file.SaveAs(path);
    Debug.WriteLine("Saved to path: " + path);

    // Update response and return guid
    context.Response.StatusCode = 200;
    context.Response.Write(guid);

    Debug.WriteLine("All Done");
}

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

В некоторых случаях загрузка просто завершается сбоем после достижения 100%, при этом событие OnComplete никогда не запускается, почти так же, как ответ от HttpHandler теряется при передаче, даже если файл сохраняется.

Я пробовал как Flajaxian, так и SWFUpload, и столкнулись с аналогичными проблемами, когда индикатор выполнения полностью не синхронизировался с фактическим ходом загрузки, указывая на завершение задолго до фактического завершения загрузки.

Эта проблема не проявляется при локальном тестировании или с небольшими файлами (обычно менее нескольких мегабайт), поскольку они имеют тенденцию загружаться довольно быстро, и задержка между загрузкой файла и завершением индикатора выполнения минимальна или отсутствует.

Есть ли способ использовать решение для загрузки Flash (например, Uploadify) с веб-приложением ASP.NET, чтобы индикатор выполнения лучше отображал фактический ход загрузки?

Обновление: в конце концов я отказался от попыток использовать загрузчик на основе флэш-памяти, так как он казался слишком неудобным, особенно индикатор выполнения, который вообще не отображал фактический ход загрузки. Заменил его на Brettle NeatUpload, который работает намного лучше.


person Mun    schedule 10.02.2010    source источник
comment
Связана ли воспринимаемая задержка с обработкой (в данном случае сохранением копии файла) после завершения загрузки файла на ваш сервер? Увеличили ли вы время ожидания сеанса в файле web.config для загрузки больших файлов? Одним из вариантов является переключение на другой индикатор выполнения после 100%, например на панель facebook, показанную здесь ajaxload.info.   -  person Todd Smith    schedule 10.02.2010
comment
@Todd - сообщения отладки указывают, что страница даже не открывается до завершения загрузки, поэтому не похоже, что проблема связана с какой-либо обработкой после загрузки. Параметры времени ожидания сеанса и максимального размера запроса уже были увеличены, но, похоже, это не связано с этой проблемой.   -  person Mun    schedule 11.02.2010
comment
Что-то вызывает перезапуск пула приложений?   -  person Todd Smith    schedule 11.02.2010