Bezdepbonusu7Программирование: статьи и ответы

Вопрос

ASP.NET MVC - альтернатива использованию сеанса

Автор вопроса: Nathan TaylorОтветов: 4

У меня есть представление ASP.NET MVC, которое использует jquery.Uploadify для отправки файлов на один из моих контроллеров для использования в мое приложение и один из побочных эффектов, которые я заметил с помощью Uploadify, заключается в том, что когда Flash-файл, который Uploadify использует для отправки файлов на сервер, отправляет моему контроллеру, он получает свой собственный SessionID из ASP.NET. Конечно, это было бы хорошо, если бы мой контроллер загрузки не использовал сеанс для хранения списка файлов, которые были загружены текущим пользователем для будущих манипуляций моим приложением ... Итак, учитывая эту проблему, после того, как я загружу файлы с моим представлением сеанс текущего пользователя не содержит никаких файлов, которые были только что опубликованы.

Любые предложения о том, как достичь того, чего я хочу, не полагаясь на сеансы (и, желательно, без базы данных)?

session

Ответы

Ответ 1 · рейтинг 2 · Chris Johnston

Поскольку Uploadify - это чисто интерфейсный скрипт, я не понимаю, почему он получает сеанс из ASP.NET. Я также не совсем понимаю, в чем ваша конкретная проблема.

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

Ответ 2 · Freddy

Может быть, статическая хеш-карта, ключом которой является пользователь: ip клиента? Значением будет любой объект, который вы хотите сохранить в разных сеансах.

Ответ 3 · Wyatt Barnett

Один момент для перекрестной проверки - вы сделали сеанс "живым", добавив в него некоторые данные перед загрузкой? ASP.NET регенерирует сеансы до тех пор, пока в нем не появятся данные.

Ответ 4 · Nathan Taylor

Это решение, которое я придумал. Я не проводил много тестов, но, похоже, это приемлемая альтернатива сеансу в моем текущем сценарии. Я буду использовать Session_End / Session_Start Global.asax, чтобы гарантировать создание и удаление строк по мере необходимости.

public class UserTable : Dictionary<string, Dictionary<string, object>>
{
    public new object this[string key]
    {
        get
        {
            object value = null;
            if (HttpContext.Current != null)
            {
                var sessionId = HttpContext.Current.Session.SessionID;
                if (ContainsKey(sessionId) && base[sessionId].ContainsKey(key))
                    value = base[sessionId][key];
            }
            else
                throw new Exception("No HttpContext present.");
            return value;
        }
        set
        {
            if (HttpContext.Current != null)
            {
                var sessionId = HttpContext.Current.Session.SessionID;
                if (!ContainsKey(sessionId))
                    Add(sessionId, new Dictionary<string, object>());
                if (!base[sessionId].ContainsKey(key))
                    base[sessionId].Add(key, value);
                else
                    base[sessionId][key] = value;
            }
            else
                throw new Exception("No HttpContext present.");
        }
    }

    public object this[string sessionId, string key]
    {
        get
        {
            object value = null;
            if (ContainsKey(sessionId) && base[sessionId].ContainsKey(key))
                value = base[sessionId][key];
            return value;
        }
        set
        {
            if (!ContainsKey(sessionId))
                Add(sessionId, new Dictionary<string, object>());
            if (!base[sessionId].ContainsKey(key))
                base[sessionId].Add(key, value);
            else
                base[sessionId][key] = value;
        }
    }

    public void Add(string sessionId)
    {
        Add(sessionId, new Dictionary<string, object>());
    }

    public void Add()
    {
        if (HttpContext.Current != null)
            Add(HttpContext.Current.Session.SessionID);
        else
            throw new Exception("No HttpContext present.");
    }

    public new void Remove(string sessionId)
    {
        base.Remove(sessionId);
    }

    public void Remove()
    {
        if (HttpContext.Current != null)
            Remove(HttpContext.Current.Session.SessionID);
        else
            throw new Exception("No HttpContext present.");
    }
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы