【问题标题】:Getting error "Object reference not set to an instance of an object"收到错误“对象引用未设置为对象的实例”
【发布时间】:2013-01-11 07:01:49
【问题描述】:

在下面的代码中,我在“if”条件行中收到错误“对象引用未设置为对象的实例”。谁能帮我解决我的代码有什么问题。

public string MemberLogOut()
    {
        string ret = string.Empty;
        try
        {
            if (HttpContext.Current.Session.Count > 0)
            HttpContext.Current.Session.Clear();
           ret="1";
        }
        catch (SqlException ex)
        {
            throw new Exception(ex.Message);
            ret="2";
        }
        return ret;
    }

【问题讨论】:

  • 哪一行抛出异常?当两条路径做同样的事情时,你为什么还要为 if 声明而烦恼?
  • 可能 HttpContext、Current 或 Session 在运行时为空? ;-)
  • ifelse 部分具有相同的声明Session.Clear()! !
  • @Jon 我编辑了代码..但它仍然给出同样的错误。

标签: c# .net session-state


【解决方案1】:

只要您在 using 语句中引用了 System.Web,那么您应该可以使用它:

if (Session != null) {Session.Clear();}

或者

if (Session != null) {Session.Abandon();}

我不确定你为什么要返回一个包含整数的字符串。布尔值会更有意义,但在这种情况下你真的不需要任何东西。

此外,您的异常处理程序正在尝试捕获 sqlexception,这也可能是对象引用错误的来源,因为您在此函数中似乎没有任何 SQL 对象。

我可能会这样做:

protected bool MemberLogOut()
{
    try {
        if (Session != null) {Session.Abandon();}
        //do any logging and additional cleanup here
        return true;
    } catch {
        return false;
    }
}

编辑:如果您实际上是从 Web 项目外部调用,则只需将当前 httpcontext 传递给以下方法:

protected bool MemberLogOut(HttpContext context)
{
    try {
        if (context != null && context.Session != null) {
            context.Session.Abandon();
        }
        //do any logging and additional cleanup here
        return true;
    } catch (Exception ex) {
        //log here if necessary
        return false;
    }
}     

【讨论】:

  • -, SessionSystem.Web.UI.Page-instance 的一个属性 并且可以通过 System.Web.HttpContext-instance 访问您没有的情况访问页面、控件……因此您需要使用System.Web.HttpContext.Current,如果您在网络场景之外运行它可以为空!那么...您指的是哪个Session-property?另一件事:如果发生异常,您应该使用通用异常处理程序catch (Exception ex) 记录此异常
  • -,还是错了...context.Current.Session != null 可以抛出异常,因为context.Current 可以为空...
  • 我明白了。但就响应式 asp.net 异常 ping 而言......当我们首先尝试关闭会话时,我什至关心记录没有会话的异常。契约完成了。
  • 您部分正确:对控制流使用异常并不是最佳实践。实际上,如果context.Current 为空,您是通过引发异常来做到这一点的——如果您再进行一次空检查会更好,因为这是一种已知行为(不应使用异常)。另一件事(以及我仍然对该答案投反对票的原因):您正在处理System.Web.HttpContext-instance,它没有Current-property,而是调用者使用例如@987654336 进行方法调用@
  • 是的,所以会话是 httpcontext 的直接属性,这段代码应该可以工作。由于失眠,我在iPad上做这件事。糟糕的代码让我昏昏欲睡。
【解决方案2】:

谁能帮我解决我的代码出了什么问题

我猜您是在 ASP.NET 应用程序之外运行此代码。 HttpContext.Current 仅存在于 Web 应用程序的上下文中。如果您尝试在外部运行此代码(例如在控制台、桌面、单元测试...),它将永远无法运行。

因此,如果这是类库中的某种代码,旨在在不同的应用程序中重用,您将必须从中删除对 HttpContext 的依赖。

旁注:你的 if 条件似乎有点没用,因为你在 else 和 if 中做完全相同的事情 -> 清除会话。

【讨论】:

  • 或者……没有Session。
  • @Darin Dimitrov 是的,代码在一个类库中,并且在不同的应用程序中使用..您能否详细说明“您必须从中删除对 HttpContext 的依赖”..跨度>
  • 当然,我会详细说明。处理这种情况的正确方法是为此 Session 对象定义和使用抽象,以便您的方法与任何 ASP.NET 特定对象弱耦合。然后这个方法将把你的抽象作为参数。您可以定义一个接口,例如 ISession,例如包含所需的操作。然后,您可以为 Web 应用程序实现此接口(当然,它会简单地包装实际的 HttpSessionState),当您想在其他类型的应用程序中使用此库时,还可以有另一个实现。
  • @DarinDimitrov 为了完整性和我们低等哺乳动物,你能在这个答案中添加这样一个例子吗?我想在另一个类中使用 Session,很高兴知道如何。微软必须只有public static void SetDataToSession<T>(this HttpSessionStateBase session, string key, object value) { .. },结果证明是牛,因为session为空,所以session[key] = value会抛出NullReferenceExceptioncode.msdn.microsoft.com/How-to-create-and-access-447ada98
  • 实际上,我这样做是为了在对此进行更多研究后遇到的另一个答案:stackoverflow.com/questions/10629882/…
【解决方案3】:

试试那个代码

public string MemberLogOut()
{
    string ret = string.Empty;
    try
    {
        if (HttpContext.Current.Session!=null)
        {HttpContext.Current.Session.Clear();}

    }
    catch (SqlException ex)
    {
        throw new Exception(ex.Message);
    }
    return "1";
}

【讨论】:

  • -, HttpContext.Current 在第一手时可能为空。
  • @AndreasNiedermair 那么如果 HttpContext.Current 为空,可能的原因是什么?
  • @dotnet_noob 在控制台/服务/wpf/winforms/...-应用程序中运行代码
  • @AndreasNiedermair 嗨。我检查并发现 HttpContext.Current 不为空,但 HttpContext.Current.Session 为空。我有两种解决方案,一种包含网站,另一种包含类库。我给出的代码包含在其中一个类库中。你能解释一下为什么 HttpContext.Current.Session 得到空值
猜你喜欢
  • 1970-01-01
  • 2011-07-09
  • 2012-08-31
  • 2011-11-21
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多