为什么此 Linq 方法会引发 Null 引用异常

Why does this Linq method throw a Null Reference Exception

提问人:mitchsnitchel 提问时间:11/28/2021 最后编辑:mitchsnitchel 更新时间:11/30/2021 访问量:173

问:

我有一个我的控制器继承自。它重写该方法。该方法将从 中检索 JWT 令牌,并使用它来检索发出请求的用户。BaseApiControllerInitializeHttpControllerContext

    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;
        }
    }

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

为什么这行代码会间歇性地抛出错误“对象引用未发送到对象的实例”?

    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;
        }
    }
ASP.NET-MVC 实体框架 LINQ NullReferenceException

评论

0赞 quain 11/29/2021
DB是和/或未期待的异步?lazydbContext
0赞 mitchsnitchel 11/29/2021
我已经设置了,但仍然抛出错误。看起来数据库上下文不是异步使用的。我已经添加了上面的代码Configuration.LazyLoadingEnabled = false
1赞 Eric J. 11/29/2021
您查询的生存期是多久?DbContext
1赞 quain 11/29/2021
尝试在 UserTokens 中直接新建 dbContext - 也可以在块中尝试。using
1赞 mitchsnitchel 11/29/2021
将代码放在 using 语句中似乎已经足够了。该错误今天没有返回。如果你想回答这个问题,我会接受的。感谢您的帮助

答:

0赞 quain 11/30/2021 #1

如评论中所述,为了便于搜索具有类似问题的其他人:
直接在 BaseApiController 中的时钟或使用语句 () 进行“新建” - 这将解决问题。
dbContextusingusingusing var ctx = new Entities(string secret)

另一种方法是强制始终通过替换RepositorydbContext

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

具有属性

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

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