У меня есть представление ASP.NET MVC, которое использует jquery.Uploadify для отправки файлов на один из моих контроллеров для использования в мое приложение и один из побочных эффектов, которые я заметил с помощью Uploadify, заключается в том, что когда Flash-файл, который Uploadify использует для отправки файлов на сервер, отправляет моему контроллеру, он получает свой собственный SessionID из ASP.NET. Конечно, это было бы хорошо, если бы мой контроллер загрузки не использовал сеанс для хранения списка файлов, которые были загружены текущим пользователем для будущих манипуляций моим приложением ... Итак, учитывая эту проблему, после того, как я загружу файлы с моим представлением сеанс текущего пользователя не содержит никаких файлов, которые были только что опубликованы.
Любые предложения о том, как достичь того, чего я хочу, не полагаясь на сеансы (и, желательно, без базы данных)?
Ответ 1 · рейтинг 2 · Chris Johnston
Поскольку Uploadify - это чисто интерфейсный скрипт, я не понимаю, почему он получает сеанс из ASP.NET. Я также не совсем понимаю, в чем ваша конкретная проблема.
Если ваша проблема заключается в том, что после загрузки файлов пользователь не может видеть их на экране, я бы предложил выяснить метод отображения списка файлов, который не зависит от Uploadify. Если это возможно, пусть он отправит токен идентификатора вместе с файлами, а затем возьмет данные, необходимые для отображения списка, из базы данных.
Ответ 2 · Freddy
Может быть, статическая хеш-карта, ключом которой является пользователь: ip клиента? Значением будет любой объект, который вы хотите сохранить в разных сеансах.
Ответ 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.");
}
}