因此,我有这段代码可以从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)”
答案 0 :(得分:1)
您遇到的死锁问题可以通过使用以下方法解决:
label
或
AuthenticationResult result = authContext.AcquireTokenAsync(resource, clientCredential).Result;
此问题是由异步代码阻塞引起的。
这些链接中描述的问题发生在对AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCredential).ConfigureAwait(false);
的调用的内部某个地方(代码未发布,所以我无法确切告诉您在哪里)