会话引发了一个看不见的捕获

本文关键字:看不见 一个 会话 | 更新日期: 2023-09-27 18:31:03

这是我的代码:

public partial class context_userpanel_IoSocial : iUserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Session["oom-user"] = "utente";
        if ((UserOOM)Session["oom-user"] == null)
        {
            Response.Write("not logged");
        }
        Response.Write("logged");
    }
}

Session["oom-user"] 中的对象类型为 UserOOM 。但是如果我在会话中存储一个字符串,我看不到任何Response.Write.为什么会这样?我该如何解决它?

会话引发了一个看不见的捕获

看不到任何Response.Write,因为强制转换为UserOOM失败,并出现运行时异常,导致应用程序关闭。

如果要将不同类型的数据存储在同一会话变量中(这可能不是最好的主意),则必须在取出它们时使用is/as而不是直接强制转换,例如:

if (Session["oom-user"] is UserOOM)
{
    // something 
}
else if (Session["oom-user"] is string)
{
    // something else
}

Session["oom-user"] 中的对象类型为 UserOOM

不是来自您的代码:

 Session["oom-user"] = "utente";

这会Session["oom-user"] string,并使类型转换失败并出现异常。

字符串"utente"类型UserOOM吗?不。

您需要修复if子句,如果您只想检查它是否null,则根本不需要强制转换:

    Session["oom-user"] = "utente";
    if (Session["oom-user"] == null)
    {
        Response.Write("not logged");
    }
    else
    {
        Response.Write("logged");
    }

这种"认证"显然不是很安全:)

引发

不可见异常的不是Session对象,异常也不是不可见的。

想象一下:你有一个 object 类型的变量,它存储了一个字符串。

object variable = "Test";

然后使用 convert 运算符将其值强制转换为不兼容的类型(这不是stringstring的子类,但string是密封类型,所以string就可以了):

SomeOtherClass asAstring = (SomeOtherClass)variable;

这失败了,InvalidCastExceptionas运算符的操作有关:

SomeOtherClass thisWillBeNUll = variable as SomeOtherClass;

所以你看,抛出异常的不是Session对象。当你写的时候

if ((SomeClass)Session["somekey"] == null) { ... }

你实际上是在写:

object thisIsOk = Session["somekey"]; // this is not the throwing place
SomeClass temp = (SomeClass)thisIsOk; // this is the throwing place
// and you won't be reaching any code until the closest `catch` clause up the stack
if (temp == null) {
}
protected void Page_Load(object sender, EventArgs e)
{
    object obj = Session["oom-user"];
    if (obj is UserOOM)
    {
        Response.Write("logged in");
    }
    else
    {
        Response.Write("not logged in");
    }
}