为啥这个 Linq 方法会抛出空引用异常

Posted

技术标签:

【中文标题】为啥这个 Linq 方法会抛出空引用异常【英文标题】:Why does this Linq method throw a Null Reference Exception为什么这个 Linq 方法会抛出空引用异常 【发布时间】:2022-01-05 11:57:09 【问题描述】:

我有一个BaseApiController,我的控制器继承自该BaseApiController。它覆盖了Initialize 方法。该方法将从HttpControllerContext 中检索 JWT 令牌,并使用它来检索发出请求的用户。

    public class BaseApiController : ApiController
    
        public static tUser CurrentUser;
        public BaseApiController()
        

        

        protected override void Initialize(HttpControllerContext controllerContext)
        
            base.Initialize(controllerContext);

            var request = controllerContext.Request;
            if (request.Headers.Authorization != null && request.Headers.Authorization.Scheme.Equals("bearer", StringComparison.OrdinalIgnoreCase))
            
                CurrentUser = Helpers.JwtAuthentication.UserToken(request.Headers.Authorization.Parameter);
            
        
        


在调用UserToken 方法时会间歇性地发生错误。方法如下。

    public static tUser UserToken(string token)
    
        string username = ExtractUserName(token);

        if (string.IsNullOrEmpty(username))
            return null;

        try
        
            tUser user = Repository.DB.tUsers.Where(u => u.UserName == username && u.IsDeleted == false).FirstOrDefault();
            return user;
        
        catch (Exception ex)
        
            return null;
        
    

tUser user = Repository.DB.tUsers.Where(u => u.UserName == username && u.IsDeleted == false).FirstOrDefault(); 行上抛出了异常,我不知道为什么。如果我检查代码行中的各种对象,它们不为空。如果我再次在代码行上执行调试器,它就可以正常运行。

为什么这行代码会间歇性抛出错误'Object reference is not sent to an instance of an object'?

    public class Repository
    
        public static Entities DB = new Entities(ConfigurationManager.AppSettings["ConnectionString"].ToString());
    

    public partial class Entities : DbContext
    
        public Entities(string secret) : base(Helpers.KeyVault.GetSecret(secret))
        
            this.Configuration.LazyLoadingEnabled = false;
        
    

【问题讨论】:

DBlazy 和/或未等待的异步 dbContext? 我已经设置了Configuration.LazyLoadingEnabled = false,但仍然抛出错误。看起来数据库上下文没有被异步使用。我已经添加了上面的代码 您查询的DbContext 的生命周期是多少? 尝试直接在 UserTokens 中新建 dbContext - 也可以在 using 块中尝试。 将代码放在 using 语句中似乎就足够了。错误今天没有返回。如果你想回答这个问题,我会接受。感谢您的帮助 【参考方案1】:

如 cmets 中所述,以方便搜索有类似问题的其他人: “新建”dbContext 直接在 BaseApiController 中的 using 时钟中或使用 using 语句 (using var ctx = new Entities(string secret)) - 这可以解决问题。

替代方法是强制 Repository 总是通过替换返回 dbContext 的新实例

public static Entities DB = new Entities(ConfigurationManager.AppSettings["ConnectionString"].ToString());

有一个属性

public static Entities DB => new Entities(ConfigurationManager.AppSettings["ConnectionString"].ToString());

如果实际解析自定义dbContext 类没有问题,它应该可以解决可能的范围问题。

【讨论】:

以上是关于为啥这个 Linq 方法会抛出空引用异常的主要内容,如果未能解决你的问题,请参考以下文章

为啥非空列表会抛出空指针异常?

为啥会抛出空对象引用上的 androidx.collection.SparseArrayCompat.size()

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?

Rest Sharp request.JsonSerializer.Serialize(Myobj) 抛出空引用异常

DBHelper.getWirtableDatabse 抛出空异常