System.Web 中的 Null Reference Exception 即使使用 try/catch 也没有被捕获 - 只发生在这段代码的第一个 运行 上,随后的 运行s 工作正常
Null Reference Exception in System.Web isn't caught even with try/catch - only occurs on first run of this code, subsequent runs work fine
所以我有这段代码可以从 Azure Active Directory 获取令牌。当这个位在服务器启动后第一次运行时,它会因空引用异常而崩溃。发生的异常记录在输出 window 中,但异常本身并未被我的代码捕获。
当我使用调试器单步执行此代码时,它根本不会继续通过 AcquireTokenAsync - 它在那里终止,异常记录在输出中,但它没有被我的 try/catch 捕获,并且没有恢复的方法。
这里没有什么是空的,所以我有点不知所措,尤其是为什么这只在服务器重新启动后发生一次。
代码
private static async Task<string> getToken()
{
string aadInstance = ConfigurationManager.AppSettings["Authority"];
string tenant = ConfigurationManager.AppSettings["Tenant"];
string clientId = ConfigurationManager.AppSettings["ClientId"];
string clientSecret = ConfigurationManager.AppSettings["ClientSecret"];
string resource = ConfigurationManager.AppSettings["GraphResourceUri"];
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
AuthenticationContext authContext = new AuthenticationContext(authority);
ClientCredential clientCredential = new ClientCredential(clientId, clientSecret);
try
{
AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential);
//anything past here never runs
return result.AccessToken;
}
catch (Exception ex)
{
Debug.WriteLine(ex.StackTrace);
}
return "";
}
编辑:
好的,我在处理异常设置后得到了一个堆栈跟踪:
StackTrace“位于 System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)”
您遇到了一个死锁问题,您可以使用以下方法解决该问题:
AuthenticationResult result = authContext.AcquireTokenAsync(resource, clientCredential).Result;
或
AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential).ConfigureAwait(false);
此问题是由异步代码阻塞引起的。
要深入了解这些主题,您可以查看 here and here
这些链接中描述的问题发生在调用 await authContext.AcquireTokenAsync(resource, clientCredential);
的内部某处(代码未发布,所以我无法告诉您确切位置)
所以我有这段代码可以从 Azure Active Directory 获取令牌。当这个位在服务器启动后第一次运行时,它会因空引用异常而崩溃。发生的异常记录在输出 window 中,但异常本身并未被我的代码捕获。
当我使用调试器单步执行此代码时,它根本不会继续通过 AcquireTokenAsync - 它在那里终止,异常记录在输出中,但它没有被我的 try/catch 捕获,并且没有恢复的方法。
这里没有什么是空的,所以我有点不知所措,尤其是为什么这只在服务器重新启动后发生一次。
代码
private static async Task<string> getToken()
{
string aadInstance = ConfigurationManager.AppSettings["Authority"];
string tenant = ConfigurationManager.AppSettings["Tenant"];
string clientId = ConfigurationManager.AppSettings["ClientId"];
string clientSecret = ConfigurationManager.AppSettings["ClientSecret"];
string resource = ConfigurationManager.AppSettings["GraphResourceUri"];
string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
AuthenticationContext authContext = new AuthenticationContext(authority);
ClientCredential clientCredential = new ClientCredential(clientId, clientSecret);
try
{
AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential);
//anything past here never runs
return result.AccessToken;
}
catch (Exception ex)
{
Debug.WriteLine(ex.StackTrace);
}
return "";
}
编辑:
好的,我在处理异常设置后得到了一个堆栈跟踪: StackTrace“位于 System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)”
您遇到了一个死锁问题,您可以使用以下方法解决该问题:
AuthenticationResult result = authContext.AcquireTokenAsync(resource, clientCredential).Result;
或
AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential).ConfigureAwait(false);
此问题是由异步代码阻塞引起的。
要深入了解这些主题,您可以查看 here and here
这些链接中描述的问题发生在调用 await authContext.AcquireTokenAsync(resource, clientCredential);
的内部某处(代码未发布,所以我无法告诉您确切位置)