FormsAuthentication.SignOut, выбрасывающий исключение NullReferenceException - PullRequest
9 голосов
/ 07 июля 2011

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

Я заметил этот код в приложении, которое я унаследовал (после того, как заметил вфайл журнала, в котором использовалось исключение):

    protected void Session_End(object sender, EventArgs e)
    {
        try
        {
            FormsAuthentication.SignOut();
            FormsAuthentication.RedirectToLoginPage();
            //if (this.Context.Handler is IRequiresSessionState || this.Context.Handler is IReadOnlySessionState)
            //{
            //    FormsAuthentication.SignOut();
            //    FormsAuthentication.RedirectToLoginPage();
            //}
        }
        catch (Exception ex)
        {
            this.GetType().GetLogger().Error(ex);
        }
    }

Мне интересно несколько вещей.Во-первых, как SignOut создает исключение нулевой ссылки?Это исключительный случай, или я делаю что-то по своей сути неправильно в моей программе?Затем, что я должен проверить, чтобы исключить это исключение перед его выбросом?

15: 51: 57,288 [13] ОШИБКА ASP.global_asax - System.NullReferenceException: ссылка на объект не установлена ​​вэкземпляр объекта.в System.Web.Security.FormsAuthentication.SignOut () в MvcApplication.Session_End

Спасибо

1 Ответ

14 голосов
/ 07 июля 2011

Важно понимать, что Session_End не обязательно выполняется в контексте HTTP-запроса.Он может работать, когда время сеанса истекло.Вы не можете ничего отправлять клиенту в это время, потому что его просто больше нет!

Следовательно, вам не следует пытаться удалить cookie проверки подлинности форм в Session_End.Если вы хотите, вы должны сделать это раньше, когда в вашем приложении нажата кнопка «Выход».Если вам нужен билет для проверки подлинности по формам пользователя, срок действия которого истекает после истечения времени ожидания, вам просто нужно соответствующим образом установить время истечения срока действия cookie (возможно, эквивалентное значению времени ожидания сеанса) в файле конфигурации.

...