即使使用try / catch也不会捕获System.Web中的Null Reference异常-仅在第一次运行此代码时发生,后续运行正常

时间:2019-01-30 19:25:44

标签: asp.net-mvc azure-active-directory microsoft-graph adal

因此,我有这段代码可以从Azure Active Directory获取令牌。服务器启动后第一次运行此位时,它将崩溃,并出现空引用异常。发生的异常记录在输出窗口中,但是我的代码未捕获到异常本身。

当我使用调试器单步执行此代码时,它根本不会继续通过AcquireTokenAsync-它在那里终止,但输出中记录了异常,但没有被try / catch捕获,并且无法恢复。

这里没有什么是空的,因此我有些茫然无法解释,尤其是为什么在服务器重新启动后仅发生一次。

代码

<?php
function array_keys_multi(array $array) {
    $uniquekeys = array();
    foreach ($array as $splitArray) {
        $keys = array_keys($splitArray);
        // instead of array_merge($keys, $uniquekeys) to obtain a header row
        // like: item, cost, approved_by, extra, extra1, extra3, etc.
        // it depends on the order of insertion in the original $array.
        $uniquekeys = array_merge($uniquekeys, $keys);
    }
    return array_unique($uniquekeys);
}

function outputCsv($fileName, $Array)
{
    ob_clean();
    header('Pragma: public');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Cache-Control: private', false);
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment;filename=' . $fileName);    
    if(isset($Array)){
        $fp = fopen('php://output', 'w');
        $keys = array_keys_multi($Array);
        fputcsv($fp, $keys);
        $keys = array_flip($keys);
        foreach($Array AS $values){
            // merge both keys and values, keeping in mind that some keys
            // that aren't originally in $values will have integer values
            // that simply represent their indexes...
            $fields = array_merge($keys, $values);
            // loop through the fields of csv line
            foreach ($fields as $key => $value) {
                // if the key isn't originally in $values
                if (!in_array($key, array_keys($values))) {
                    // make it null
                    $fields[$key] = null;
                }
            }
            fputcsv($fp, $fields);
        }
        fclose($fp);
    }
    ob_flush();
}

编辑:

好吧,在弄乱了异常设置之后,我有了堆栈跟踪:         StackTrace“位于System.Web.ThreadContext.AssociateWithCurrentThread(Boolean setImpersonationContext)”

1 个答案:

答案 0 :(得分:1)

您遇到的死锁问题可以通过使用以下方法解决:

label

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

此问题是由异步代码阻塞引起的。

要深入了解这些主题,可以检查herehere

这些链接中描述的问题发生在对AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential).ConfigureAwait(false);的调用的内部某个地方(代码未发布,所以我无法确切告诉您在哪里)