我有一个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();
行上抛出的,我不知道为什么。如果我检查代码行中的各种对象,它们就不会为空。如果我再次在代码行上执行调试器,它将毫无问题地运行。
为什么这行代码会间歇性地抛出错误"对象引用没有发送到对象的实例"?
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;
}
}
如评论中所述,为了方便搜索其他有类似问题的人:
"New up";dbContext
直接在using
时钟中的BaseApiController中,或者使用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
类没有问题,就可以完成此操作。