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