【问题标题】: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 语句中似乎就足够了。错误今天没有返回。如果你想回答这个问题,我会接受。感谢您的帮助

标签: asp.net-mvc entity-framework linq nullreferenceexception


【解决方案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 类没有问题,它应该可以解决可能的范围问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多