【问题标题】:FormsAuthentication.SignOut throwing NullReferenceExceptionFormsAuthentication.SignOut 抛出 NullReferenceException
【发布时间】:2011-07-06 23:22:40
【问题描述】:

这个问题似乎与this 帖子有关,但我无法从帖子中推断出解决方案。

我在我继承的应用程序中注意到了这段代码(在日志文件中注意到异常被吃掉之后):

    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

谢谢

【问题讨论】:

    标签: c# formsauthentication


    【解决方案1】:

    重要的是要意识到Session_End 不一定会在 HTTP 请求的上下文中执行。它可能会在会话超时时运行。那时你不能向客户发送任何东西,因为它根本就不存在了!

    因此,您不应尝试删除Session_End 中的表单身份验证cookie。如果您愿意,您应该尽快执行此操作,即在您的应用程序某处单击“注销”按钮时。如果您需要用户的表单身份验证票证在超时发生后过期,您只需在配置文件中适当地设置 cookie 过期时间(可能等同于会话超时值)。

    【讨论】:

    • 啊……我读过一些类似的东西,但直到我读到它的措辞不同时才明白。是说我应该验证 HttpContext.Current 的存在,还是说吃错误消息是处理 Session_End 触发时的“随机性”的可接受方法?
    • @Sean 您应该使用Session_End 删除身份验证cookie。它有不同的用途,您只能假设您在该上下文中访问服务器端的东西。此外,你为什么首先需要它?如果您希望 cookie 过期,只需通过设置其超时时间让它过期。
    • 嘿,还有一个简单的问题。我正在阅读有关何时调用 Session_End 的怪癖,它指出(除了超时)调用 Session_End 的唯一其他方式是通过 Session.Abandon。在我正在研究的解决方案中,我只发现了一个 Session.Abanadon 实例。您知道 Session_End 触发的其他方式吗?只是想确保我不会破坏功能。
    • @Sean 不,我认为默认情况下没有其他方法可以运行它,除了手动弄乱引擎盖下的东西。
    • 太棒了!一些初步测试看起来也解决了我遇到的问题。挺开心。谢谢!
    猜你喜欢
    • 2013-05-30
    • 2020-11-17
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多