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); 的内部某处(代码未发布,所以我无法告诉您确切位置)