Null Reference Exception в System.Web не перехватывается даже при использовании try / catch - возникает только при первом запуске этого кода, последующие запуски работают нормально - PullRequest
0 голосов
/ 30 января 2019

Итак, у меня есть этот фрагмент кода, который получает токен из Azure Active Directory.Когда этот бит запускается в первый раз после запуска сервера, он падает с исключением нулевой ссылки.Происходящее исключение записывается в окне вывода, но само исключение не перехватывается моим кодом.

Когда я использую отладчик для просмотра этого кода, он просто не продолжается после 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) "

1 Ответ

0 голосов
/ 30 января 2019

Вы столкнулись с проблемой тупиковой ситуации, которую можно преодолеть с помощью:

AuthenticationResult result = authContext.AcquireTokenAsync(resource, clientCredential).Result;

или

AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential).ConfigureAwait(false);

Эта проблемавызвано блокировкой асинхронного кода.

Чтобы глубже погрузиться в эти темы, вы можете проверить здесь и здесь

Проблемы, описанные в этих ссылках, возникают где-то внутрипозвоните по номеру await authContext.AcquireTokenAsync(resource, clientCredential); (код не опубликован, поэтому я не могу точно сказать, где именно)

...