объект переменной сеанса удаляется при обратной передаче - ASP.NET - PullRequest
3 голосов
/ 20 февраля 2010

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

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 ]

2 голосов
/ 24 февраля 2010

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

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

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

1 голос
/ 24 февраля 2010

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

1 голос
/ 21 февраля 2010

Ваша папка 'files' находится в папке вашего веб-приложения? Может быть приложение перезапускается при удалении файлов. Попробуйте использовать sessionStateServer. Его поддерживают сессии.

Web.config:

<configuration>
    <system.web>
        <sessionState mode="StateServer"></sessionState>
    </system.web>
</configuration>
0 голосов
/ 21 февраля 2010

Сначала пара проверок работоспособности:

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

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

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

Спасибо

0 голосов
/ 21 февраля 2010

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

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

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

Я почти уверен, что вы согласитесь с описанием, если создадите Global.asax и установите точки останова на Application_OnError и Session_OnStart (или какими-либо этими методами написаны правильно). Вы увидите, что возникает ошибка, и после этого начинается новый сеанс.

0 голосов
/ 20 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...