为什么这个 Linq 方法会抛出 Null Reference Exception

Why does this Linq method throw a Null Reference Exception

我的控制器继承自 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;
        }
    }

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

替代方法是通过替换

强制Repository总是returndbContext的新实例
public static Entities DB = new Entities(ConfigurationManager.AppSettings["ConnectionString"].ToString());

属性

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

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