Итак, моя ошибка заключалась в том, что я не учитывал пользовательский процесс аутентификации. Я нашел другую документацию, которая, кстати, должна определенно использоваться:
Настройка потока аутентификации пула пользователей
Я столкнулся с 2 неправильными частями в документация здесь (подстраницы триггеров) и 1 ошибка с моей стороны.
Неправильная часть 1: входные данные DefineAuthChallenge и CreateAuthChallenge для сеанса определены как список результатов испытаний. Это все нормально, но объект результата запроса имеет неправильно отображаемую часть метаданных вызова, которая записывается так: «ChallengeMetaData», когда вместо этого должно быть «ChallengeMetadata», с строчным «d» вместо «data» вместо «data» верхний регистр один. Это дало мне ошибку «Нераспознанный лямбда-вывод», потому что «ChallengeMetaData» не был тем, чего ожидал сервер, он искал «ChallengeMetadata», которого не было. Когда вы в первый раз вводите лямбду define auth challenge, эта ошибка не отображается, потому что сеанс не содержит ответов на вызов. Однако, как только вы подтвердите вызов, он заполняется, и заглавная буква d доставляет вам неприятности.
Неправильная часть 2: Как описано в моем вопросе, вход VerifyAuthChallenge для «challengeAnswer» - это строка, а не словарь.
Все эти неправильные части правильно отображаются на первой странице документации, на которую я ссылаюсь здесь. Поэтому я бы рекомендовал использовать это вместо другой документации.
Ошибка на моей стороне: я действительно не проверял, что происходит после того, как вы проверите пользовательский вызов с помощью триггера VerifyAuthChallenge. В приведенной ссылке на изображении над заголовком «Лямбда-триггер DefineAuthChallenge: задачи (конечный автомат)» четко указано, что после проверки ответа снова запускается триггер DefineAuthChallenge, который я не рассматривал. [118 ]
Я надеюсь, что смогу сэкономить кому-то время, которое понадобилось мне, чтобы разобраться с этим: -)
Я рекомендовал бы против прокрутки Вашего собственного создания хеша, функционируют и вместо этого полагаются на встроенное XNodeEqualityComparer
GetHashCode
метод. Это гарантирует, что приняло во внимание атрибуты и порожденные узлы при создании результата и могло сэкономить Вам некоторое время также.
Ваш код был бы похож на следующее:
XNodeEqualityComparer comparer = new XNodeEqualityComparer();
XDocument doc = XDocument.Load("XmlFile1.xml");
Dictionary<int, XNode> nodeDictionary = new Dictionary<int, XNode>();
foreach (XNode node in doc.Elements("doc").Elements("node"))
{
int hash = comparer.GetHashCode(node);
if (nodeDictionary.ContainsKey(hash))
{
// A duplicate has been found. Execute your logic here
// ...
}
else
{
nodeDictionary.Add(hash, node);
}
}
Мой XmlFile1.xml:
<?xml version="1.0" encoding="utf-8" ?>
<doc>
<node att="A">Blah</node>
<node att="A">Blah</node>
<node att="B">
<inner>Innertext</inner>
</node>
<node>Blah</node>
<node att="B">
<inner>Different</inner>
</node>
</doc>
nodeDictionary
закончит тем, что содержал уникальный набор Узлов и их хешей. Дубликаты обнаруживаются при помощи Dictionary
ContainsKey
метод, передающий в хеше узла, который мы генерируем использование XNodeEqualityComparer
GetHashCode
метод.
Я думаю, что это должно быть достаточно быстро для Ваших потребностей.
Что относительно этого подхода:
Для всех <w:pPr>
узлы в документе (я предполагаю, существует не больше чем один на <w:p>
), свяжите все соответствующие данные (имена элементов, атрибуты, значения) в строку:
// string format is really irrelevant, so this is just a bogus example
'!w:keep-with-next@value="true"!w:spacing@w:before="10"@w:after="120"'
Сделайте так на алфавитном порядке, для составления переменного порядка документа.
Создайте набор с помощью этих строк в качестве ключа и ссылки на соответствующее <w:p>
узел как значение.
В процессе выполнения этого при ударе точки, что данный ключ уже существует в наборе, Вы нашли абзац с теми же свойствами. Работа со списком узлов как значение набора, если Вы хотите продолжать собираться.
Я не могу сказать, как хорошо это работало бы, но я предполагаю, что не слишком трудно реализовать и узнать.
Вот хеш-функция, которую я поднял, который пытается решить часть Вашей проблемы. Обратите внимание, что я имею очень мало опыта при записи хеш-функций и включал его главным образом для получения обратной связи от людей относительно, он - эффективность в решении этой конкретной проблемы. Я не рекомендовал бы, чтобы это было использование в производстве.
static int HashXElement(XElement elem)
{
int hash = 23;
foreach (XAttribute attrib in elem.Attributes())
{
int attribHash = 23;
attribHash = attribHash * 37 + attrib.Name.GetHashCode();
attribHash = attribHash * 37 + attrib.Value.GetHashCode();
hash = hash ^ attribHash;
}
foreach(XElement subElem in elem.Descendants())
{
hash = hash * 37 + XmlHash(subElem);
}
hash = hash * 37 + elem.Value.GetHashCode();
return hash;
}
Идеи состояли в том, чтобы сделать упорядочивание подузлов значительным, но упорядочивание атрибутов не значительный.
не прямой ответ на Ваш вопрос, но тесно связанный с тем, чего Вы пытаетесь достигнуть: взгляните на XmlDiff (электроинструменты .net XML)
Это очень сложно даже для определения правильно проблемы
"Когда два xml документа равны?"
Существует много причин этого:
Поэтому это кажется наивным и нереалистичным, чтобы попытаться произвести корректную реализацию функции для сравнения равенства двух XML-документов.
Моя рекомендация состоит в том, чтобы использовать глубоко-равное () функция с совместимым механизмом XPath 2.0.