Объект переменной сеанса удаляется при обратной передаче - ASP.NET
Я сделал что-то вроде следующего кода:
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = Session["loginid"].ToString();
}
protected void delete_click(object sender, EventArgs e)
{
delete("mail1",Session["loginid"]);
}
private int delete(string mailid, string user)
{
System.IO.Directory.Delete(Server.MapPath(@"~\files\" + user + @"\" + mailid), true);
}
Когда я нажимаю кнопку удаления, все работает нормально, и папка удаляется. но после этого, когда страница снова выполняет обратную передачу, возникает исключение NullRefrenceException в Label1.Text = Session["loginid"].ToString();
почему это происходит...??
Когда я не использую этот метод Directory.Delete(), все работает нормально, а переменные сеанса не имеют нулевого значения.
Когда я проследил свое приложение, я обнаружил, что переменные сеанса метода After Directory.Delete() остались нетронутыми, и я смог использовать эти переменные сеанса при обработке после Directory.Delete().
Но как только страница отправляется обратно, все переменные сеанса устанавливаются в нуль. И эта проблема не появляется, когда я не использую этот метод delete().
Папка, которую я удаляю, находится в папке моего проекта. Я управляю этим сайтом, используя Visual Studio.
Пожалуйста помоги.
6 ответов
Просто еще одно предположение, но, возможно, это потому, что вы изменили что-то в каталоге ваших приложений (догадка, так как вы используете Server.MapPath
с ~
). IIS, возможно, думает, что приложение изменилось и перезапускает приложение, и в результате удаляет все сеансы.
Это похоже на изменение файла web.config, когда кто-то использует приложение, и он удаляет все сеансы и перезагружает приложение. Вы удаляете каталог, который может содержать информацию, которую IIS использует для приложения?
Вы сказали, что это происходит только тогда, когда вы включаете эту строку кода, и сессия действительно будет последовательно очищаться (если вы не делаете это вручную), когда приложение перезагружается IIS или по истечении времени ожидания. Это явно не время ожидания, поэтому рециркуляция должна быть тем, что происходит.
Удаление папки в вашем виртуальном каталоге может привести к перезапуску приложения, что приведет к потере всех данных сеанса. Чтобы предотвратить это, удалите отдельные файлы (не папки) или используйте StateServer для поддержки ваших сеансов.
Ваша папка 'files' находится в папке вашего веб-приложения? Может быть, приложение перезапускается при удалении файлов. Попробуйте использовать sessionStateServer. Его поддерживают сессии.
Web.config:
<configuration>
<system.web>
<sessionState mode="StateServer"></sessionState>
</system.web>
</configuration>
Сначала пара проверок работоспособности:
- Работает ли сессия как ожидается на других страницах?
- Ваш метод Delete удаляет файлы в специальной папке ASP.NET, такой как App_Data или App_Code, что может вызывать перезапуск приложения?
Вот что я хотел бы попробовать отладить эту проблему, проверив выше:
- Установите точку останова на методе удаления и укажите переменную сеанса в окне наблюдения. Посмотрите, что значение переменной сеанса перед вызовом Directory.Delete и что это после. Это в тот момент, когда вы проигрываете сессию, или нет до следующего посещения страницы?
- Используйте такой инструмент, как Fiddler, для проверки файлов cookie, которыми обмениваются браузер и веб-сервер на постбэки. Убедитесь, что при первом посещении браузера новый файл cookie сеанса создается и сохраняется в браузере. Затем при удалении папки проверьте, отправляет ли веб-сервер новый файл cookie сеанса в ответ на эту обратную передачу. Это будет означать, что новый сеанс был создан.
Спасибо
Если я уберу функцию directory.delete() из кода, тогда все приложение будет работать без каких-либо исключений.
Хорошо, похоже, мы нашли вашу проблему. Ваш проект не имеет необходимых привилегий для удаления директории (даже если каталог удален. Тем не менее: есть проблемы с привилегиями)
Я предполагаю, что ваше приложение выдает исключение при выполнении этой файловой операции, и начинается новый сеанс. У меня похожая ситуация по одному из моих проектов, но я до сих пор не понял, как ее решить.
Я почти уверен, что вы согласитесь с описанием, если создадите Global.asax и установите точки останова для Application_OnError и Session_OnStart (или, тем не менее, эти методы написаны правильно). Вы увидите, что возникает ошибка, и после этого начинается новый сеанс.
Поскольку страница загружается правильно перед нажатием кнопки удаления, проблема, вероятно, связана с Session["loginid"].ToString()
ссылка. У вас есть другой код, который ссылается Session["loginid"]
? Код, который вы показали здесь, не будет делать ничего, что удаляет loginid
с сессии.
Однако, если это приложение работает на кластере серверов и вы используете режим сеанса по умолчанию в процессе, вы можете потерять доступ к вашему сеансу между HTTP-запросами, потому что они обрабатываются разными серверами. Смотрите здесь для получения дополнительной информации.