ASP.NET MVC - альтернатива использованию сессии - PullRequest
3 голосов
/ 11 августа 2009

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

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

Ответы [ 4 ]

2 голосов
/ 11 августа 2009

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

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

0 голосов
/ 11 августа 2009

Это решение, которое я придумал. Я не проводил много испытаний, но это кажется приемлемой альтернативой Session в моем текущем сценарии. Я буду использовать 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.");
    }
}
0 голосов
/ 11 августа 2009

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

0 голосов
/ 11 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...