为啥这个 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;
【问题讨论】:
DB
是 lazy
和/或未等待的异步 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变量时会抛出空指针异常?