Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) возвращает String.Empty
У меня есть приложение asp.net mvc3. Теперь я хочу сохранить пользовательские данные в
C:\Users{AppPoolUserAccount}\AppData\Roaming\MyProgramm...
По первому зову Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
я только получаю "" (String.Empty). На второй звонок Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
возвращает правильный путь...
Примечание. Процедура находится в контексте входа в систему. Я хочу сохранить имя пользователя и sessionID в xml-файле, чтобы два пользователя не могли одновременно войти в систему через одну учетную запись.
Зачем?
3 ответа
Environment.GetFolderPath
возвращает пустые строки для большинства значений перечисления SpecialFolder, потому что профиль пользователя, которого вы используете для запуска пула приложений, не загружен.
Необходимо настроить пул приложений для загрузки профиля пользователя. Для этого перейдите в "Диспетчер IIS"> "Пулы приложений"> "YourAppPool"> "Дополнительные параметры"> "Загрузить профиль пользователя" и установите для него значение "true" или откройте командную строку и запустите
appcmd set apppool "MyAppPool" -processModel.loadUserProfile:true
(обычно вы запускаете это в C:\Windows\SysWOW64\inetsrv).
Вот пара ссылок с большим количеством данных:
- loadUserProfile и IIS7 (этот говорит, что загрузка профиля - это установка по умолчанию, но это не так, в противном случае это возможно. Возможно, они изменили значение по умолчанию между 7 и 7,5?)
- Настройки модели процесса для пула приложений
Environment.GetFolderPath
возвращает пустую строку, если папка не существует. Из MSDN:
Environment.GetFolderPath Метод (Environment.SpecialFolder)
Возвращаемое значение Тип: System.String
Путь к указанной системной специальной папке, если эта папка физически существует на вашем компьютере; в противном случае - пустая строка ("").
Папка не будет существовать физически, если операционная система не создала ее, существующая папка была удалена или папка представляет собой виртуальный каталог, например "Мой компьютер", который не соответствует физическому пути.
Если вы хотите поделиться данными (например, в настоящее время зарегистрированные пользователи), попробуйте использовать этот код:
В global.asax при запуске приложения:
var users = new List<Guid>();
Application["loggedUsers"] = users;
Затем, если пользователь входит в систему, введите это:
var users = (List<Guid>)Application["loggedUsers"];
users.Add(currentlyLoggingOnUserId);
Application["loggedUsers"] = users;