Я использую загрузчик Yahoo, часть библиотеки пользовательского интерфейса Yahoo, на моем сайте ASP.Net, чтобы пользователи могли загружать файлы. Для незнакомых пользователей загрузчик работает с помощью апплета Flash, чтобы дать мне больше контроля над диалогом FileOpen. Я могу задать фильтр для типов файлов, позволяют несколько файлов, которые будут выбраны, и т.д. Это здорово, но она имеет следующий документированную ограничение:Могу ли я установить идентификатор сеанса ASP.Net в поле скрытой формы?
Из-за известной флэш-ошибка, то загрузчик работает в Firefox в Windows, делает не отправлять правильные файлы cookie с загрузкой; вместо отправки файлов cookie Firefox он отправляет файлы cookie в Internet Explorer для соответствующего домена. В качестве обходного пути мы предлагаем либо использовать метод загрузки cookieless, либо добавить document.cookie в запрос на загрузку.
Таким образом, если пользователь использует Firefox, я не могу полагаться на файлы cookie, чтобы сохранить их сессию при загрузке файла. Мне нужна их сессия, потому что мне нужно знать, кто они! В качестве обходного пути, я использую объект Application таким образом:
Guid UploadID = Guid.NewGuid();
Application.Add(Guid.ToString(), User);
Итак, я создаю уникальный идентификатор и использовать его в качестве ключа для хранения Page.User
объекта в рамках приложения. Я включаю этот ID как переменную в POST при загрузке файла. Затем в обработчике, который принимает загрузки файла, я захватить объект пользователя таким образом:
IPrincipal User = (IPrincipal)Application[Request.Form["uploadid"]];
Это на самом деле работает, но она имеет две вопиющие недостатки:
Если IIS, приложение бассейн, или даже просто приложение перезапускается между моментом, когда пользователь посещает страницу загрузки, и фактически загружает файл, их «uploadid» удаляется из области приложения, и загрузка не выполняется, потому что я не могу их аутентифицировать.
Если я когда-либо масштабируюся до сценария веб-фермы (возможно, даже веб-сада), это полностью сломается. Я мог бы не волноваться, если не планировать масштабирование этого приложения в будущем.
У кого-нибудь есть лучший способ? Есть ли способ передать фактический идентификатор сеанса ASP.Net в переменной POST, а затем использовать этот идентификатор на другом конце для получения сеанса?
Я знаю, что могу получить идентификатор сеанса через Session.SessionID
, и я знаю, как использовать YUI, чтобы опубликовать его на следующей странице. Я не знаю, как использовать этот SessionID
для захвата сеанса с государственного сервера.
Да, я использую государственный сервер для хранения сеансов, поэтому они сохраняют перезапуск приложения/IIS и будут работать в сценарии веб-фермы.
Это именно то, что я искал. Благодаря! – 2008-10-27 15:58:41
Эй ... ссылка, похоже, сломана. – Mulki 2010-10-28 07:00:24