объект переменной сеанса удаляется при обратной передаче - ASP.NET

StackOverflow https://stackoverflow.com/questions/2303642

Вопрос

Я создал что-то вроде следующего кода:

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();

почему это происходит ...??

Когда я не использую этот каталог.Метод Delete(), все работает нормально, и переменным сеанса не присвоено значение null.

Когда я проследил за своим приложением, я обнаружил, что после каталога.Переменные сеанса метода Delete () остались нетронутыми, и я смог использовать эти переменные сеанса в обработке после каталога.Delete().

Но как только страница выполняет обратную отправку, всем переменным сеанса присваивается значение null.И эта проблема не появляется, когда я не использую этот метод delete().

Папка, которую я удаляю, находится в папке моего проекта.Я запускаю этот веб-сайт с помощью Visual Studio.

Пожалуйста, помогите.

Это было полезно?

Решение

Просто еще одно предположение здесь, но, возможно, это потому, что вы что-то изменяете в своем каталоге приложений (догадка, поскольку вы используете Server.MapPath с помощью ~).Возможно, IIS считает, что приложение изменилось, и перерабатывает приложение, в результате чего все сеансы стираются.

Это похоже на то, как если бы вы изменили свой файл web.config, пока кто-то использует приложение, и оно отбросило все сеансы и повторно запустило приложение.Вы удаляете каталог, который может содержать информацию, используемую IIS для приложения?

Вы сказали, что это происходит только тогда, когда вы включаете эту строку кода, и сеанс действительно будет уничтожен только последовательно (если вы не делаете это самостоятельно вручную), когда приложение повторно загружается IIS или истекает время ожидания.Очевидно, что это не тайм-аут, поэтому утилизация должна быть тем, что происходит.

Другие советы

Находится ли ваша папка "файлы" в папке вашего веб-приложения?Возможно, приложение перезапускается само при удалении файлов.Попробуйте использовать sessionStateServer.Это поддерживает сеансы живыми.

Web.конфигурация:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>

Удаление папки в вашем виртуальном каталоге может привести к повторному запуску вашего приложения, что приведет к потере всех данных сеанса.Чтобы предотвратить это, либо удалите отдельные файлы (не папки), либо используйте StateServer для поддержания ваших сеансов.

Поскольку страница загружается корректно до того, как вы нажмете кнопку удаления, проблема, по-видимому, связана с Session["loginid"].ToString() ссылка.Есть ли у вас какой-либо другой код, который ссылается Session["loginid"]?Код, который вы показали здесь, не будет делать ничего, что удаляет loginid с Сеанса.

Однако, если это приложение запущено на кластере серверов и вы используете режим сеанса по умолчанию in-process, вы можете потерять доступ к своему сеансу между HTTP-запросами, поскольку они обрабатываются разными серверами.Видишь здесь для получения дополнительной информации.

Если я удалить каталог.удалить() функция из кода, то все приложение работает так хорошо без исключения

Хорошо, кажется, мы нашли вашу проблему.У вашего проекта нет необходимых привилегий для удаления директории (даже если каталог удален.тем не менее:существуют проблемы с привилегиями)

Я предполагаю, что ваше приложение выдает исключение при выполнении этой файловой операции, и начинается новый сеанс.У меня похожая ситуация в одном из моих проектов, но я до сих пор не понял, как ее решить.

Я почти уверен, что вы согласитесь с описанием, если вы создадите Глобальный.asax и установите контрольные точки на Application_OnError Ошибка приложения и Сессия_onstart (начало сеанса ) (или, однако, эти методы написаны правильно).Вы увидите, что выдается сообщение об ошибке, после чего запускается новый сеанс.

Сначала пара проверок на вменяемость:

  1. Работает ли сеанс, как ожидалось, на других страницах?
  2. Удаляет ли ваш метод удаления файлы в специальной папке ASP.NET например, App_Data или App_Code, что может привести к перезапуску приложения?

Вот что я бы попытался отладить эту проблему, после проверки вышеизложенного:

  1. Установите точку останова для метода удаления и отобразите переменную сеанса в окне просмотра.Посмотрите, какое значение имеет переменная сеанса перед вызовом Directory.Что такое Delete и что это такое после.Это происходит в тот момент, когда вы теряете сеанс, или не происходит до следующего посещения страницы?
  2. Используйте такой инструмент, как Fiddler, для проверки файлов cookie, которыми обмениваются браузер и веб-сервер при обратной передаче.Убедитесь, что при первом посещении браузера создается новый файл cookie сеанса и сохраняется в браузере.Затем, при удалении папки, проверьте, отправляет ли веб-сервер новое сессионный файл cookie в ответе на эту обратную отправку.Это будет означать, что был создан новый сеанс.

Спасибо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top