Как сохранить сеанс во время загрузки файла?

У меня есть приложение, которое позволяет пользователям загружать аудиофайлы. В некоторых очень больших файлах (1-2 ГБ) я столкнулся с проблемой, что время сеанса/аутентификации пользователя истекает, поэтому, когда файл завершает загрузку (что он делает успешно), пользователь вынужден снова войти в систему.

Я использую сторонний инструмент под названием FileUploader на внешнем интерфейсе и ashx на стороне сервера для обработки входящего файла.

Есть ли у кого-нибудь предложения о том, как предотвратить истечение времени сеанса/аутентификации во время загрузки файла? В основном я хотел бы, чтобы время загрузки файла рассматривалось так, как если бы пользователь активно использовал сайт.


person Abe Miessler    schedule 02.07.2014    source источник
comment
есть параллельный запрос ajax для периодической проверки связи с сервером во время загрузки?   -  person Marc B    schedule 03.07.2014
comment
Или в качестве другого решения, может быть, просто увеличить время ожидания сеанса с 20 минут до большего значения?   -  person Sergey Litvinov    schedule 03.07.2014
comment
@MarcB, это интересная идея. Я предполагаю, что я бы сделал это со стороны клиента? Что было бы хорошим способом сделать это? Возможно, запустить запрос GET от jquery, который получает крошечный фиктивный HTML-файл?   -  person Abe Miessler    schedule 03.07.2014
comment
Ваш сеанс должен истечь только в том случае, если в течение длительного периода отсутствует какая-либо активность HTTP. Это может произойти, когда ваш сервер объединяет фрагменты после того, как все они были отправлены на сервер. Этот комбинированный процесс, вероятно, приводит к длительному периоду бездействия. Если это описывает вашу проблему, см. stackoverflow.com/questions/23502554/.   -  person Ray Nicholus    schedule 03.07.2014
comment
@RayNicholus, интересно, так вы говорите, что во время фактической загрузки файла asp.net считает, что существует HTTP-активность, но как только файл загружен и обрабатывается на стороне сервера, HTTP-активность больше не существует?   -  person Abe Miessler    schedule 03.07.2014
comment
Во время загрузки, безусловно, существует HTTP-активность. Если фрагментация включена (я предполагаю, что это для таких больших файлов), ваш сервер не будет отвечать на последний запрос Fine Uploader, по-видимому, до тех пор, пока все фрагменты не будут объединены. Это может занять некоторое время, если большие файлы разбиты на небольшие фрагменты. Пока Fine Uploader ожидает этого ответа, HTTP-активность, разумеется, отсутствует (при условии, что на странице больше ничего не происходит). Какое значение тайм-аута установлено? Вы видите тайм-аут в конце загрузки?   -  person Ray Nicholus    schedule 03.07.2014
comment
Ну, я установил тайм-аут на 1 минуту для целей тестирования. Я знаю, что такой сценарий может возникнуть в реальном мире, но я не хочу ждать 30 минут каждый раз, когда загружаю файл. Я вижу тайм-ауты, когда файл завершает загрузку с точки зрения браузера.   -  person Abe Miessler    schedule 03.07.2014


Ответы (1)


Как насчет использования события прогресса FineUploader и выполнения Ajax-вызова нового метода WebService, который обновляет сеанс каждый раз, когда прогресс запускается:

[System.Web.Script.Services.ScriptService]
public class SessionAlive : System.Web.Services.WebService
{

    [WebMethod]
    public void UpdateSession()
    {
        HttpContext.Current.Session["tempVariable"] = DateTime.Now;
    }
}

Или вы можете использовать тайм-аут, который начинается, когда начинается загрузка:

 $(document).ready(function() {
    setTimeout(updateSession, 1000*60);//Timeout is 1 min
});

function updateSession() {
    $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        url: "SessionAlive.asmx/UpdateSession",
        data: "{}",
        dataType: "json"
    });
    setTimeout(updateSession, 1000 * 60);
}

Справочник

person Brian Ogden    schedule 02.07.2014
comment
Еще один момент, который я обнаружил при поиске этого решения. WebMethod должен быть украшен: [WebMethod(EnableSession=true)] - person drdwilcox; 25.10.2016