加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 静态方法中的HttpContext.Current NullReferenceExce

发布时间:2020-12-16 06:36:03 所属栏目:asp.Net 来源:网络整理
导读:我有一个静态类,有几个静态方法.在这些方法中,我试图使用HttpContext.Current访问当前线程的上下文.例如: var userName = HttpContext.Current.User.Identity.Name; 但是,当我这样做时,我收到一个NullReferenceException,臭名昭着的“对象引用未设置为对象
我有一个静态类,有几个静态方法.在这些方法中,我试图使用HttpContext.Current访问当前线程的上下文.例如:

var userName = HttpContext.Current.User.Identity.Name;

但是,当我这样做时,我收到一个NullReferenceException,臭名昭着的“对象引用未设置为对象的实例”.

有任何想法吗?

解决方法

从原始帖子中不清楚HttpContext实际上是什么缺失. HttpContext.User属性在生命周期的某些阶段也可以为null,这将为您提供完全相同的异常.除了所有其他问题之外,您需要逐步查看源代码并查看表达式的哪个部分实际上为null.

当您编写引用静态方法/属性(如HttpContext.Current)的代码时,您必须编写它们,因为它们知道在方法/属性实际可用时无法保证运行代码.通常你有这样的事情:

static string GetCurrentUserName()
{
    HttpContext context = HttpContext.Current;
    if (context == null)
        return null;
    IPrincipal user = context.User;
    if (user == null)
        return null;
    return user.Identity.Name;
}

虽然我怀疑这不会真正解决你的问题,但它只会摆脱异常.问题更可能是您在上下文根本不可用的时间或地点调用此方法,例如在后台线程,静态构造函数或字段初始化程序,或Application_BeginRequest方法或某些类似的位置.

我可能首先将静态方法更改为依赖于HttpContext实例的类的实例方法(即在构造函数中采用).很容易欺骗自己认为像GetCurrentUserName这样的方法是简单的“实用”方法,但它们实际上并非如此,并且通过静态属性从任何你不喜欢的地方调用引用HttpContext.Current的方法通常是无效的.已经有一个对同一个HttpContext的实例引用(即来自Page类).如果你开始重写这样的类,可能性是:

public class UserResolver
{
    private HttpContext context;

    public UserResolver(HttpContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");
        this.context = context;
    }

    public string GetUserName()
    {
        return (context.User != null) ? context.User.Identity.Name : null;
    }
}

…那么你很可能会很快发现链被破坏的位置,这将是你需要引用HttpContext.Current的点,因为你无法从其他任何地方获取它.

在这种特定情况下,显然,您可以通过获取NullReferenceException的堆栈跟踪来找出链开始的位置/时间来解决问题,因此您不必进行上面描述的更改 – 我是简单地推荐一种有助于在将来减少这类“遗失单身”错误的一般方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读