Компиляция XmlSchemaSet с импортированными схемами - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать XmlSchemaSet для набора определений схемы SAML 2.0, начиная со схемы протокола здесь: https://docs.oasis -open.org / security / saml / v2.0 / saml-schema-protocol-2.0.xsd

var set = new XmlSchemaSet();

XmlSchema schema;
using (var reader = XmlReader.Create(
    "https://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd"))
{
    schema = XmlSchema.Read(reader, (sender, e) => Console.WriteLine(e.Message));
}

set.Add(schema);

set.Compile();

Когда вызывается Compile, выдается следующее исключение:

System.Xml.Schema.XmlSchemaException
Type 'urn:oasis:names:tc:SAML:2.0:assertion:EncryptedElementType' is not declared.
   at System.Xml.Schema.XmlSchemaSet.InternalValidationCallback(Object sender, ValidationEventArgs e)
   at System.Xml.Schema.BaseProcessor.SendValidationEvent(XmlSchemaException e, XmlSeverityType severity)
   at System.Xml.Schema.BaseProcessor.SendValidationEvent(XmlSchemaException e)
   at System.Xml.Schema.Compiler.CompileElement(XmlSchemaElement xe)
   at System.Xml.Schema.Compiler.Compile()
   at System.Xml.Schema.Compiler.Execute(XmlSchemaSet schemaSet, SchemaInfo schemaCompiledInfo)
   at System.Xml.Schema.XmlSchemaSet.Compile()
   at XSD.Program.Main(String[] args)

Указанный тип urn:oasis:names:tc:SAML:2.0:assertion:EncryptedElementType появляется вПространство имен, импортированное в начало схемы:

<import
    namespace="urn:oasis:names:tc:SAML:2.0:assertion"
    schemaLocation="saml-schema-assertion-2.0.xsd"/>

С помощью Fiddler я не вижу, чтобы приложение предпринимало какие-либо попытки получить импортированную схему.

Почему нет этих операторов импортапохоже работает с XmlSchemaSet?

1 Ответ

0 голосов
/ 28 ноября 2018

Поведение XmlSchemaSet по умолчанию - не пытаться разрешить какие-либо внешние схемы.Для этого необходимо установить свойство XmlResolver.Реализация распознавателя перехода: XmlUrlResolver:

set.XmlResolver = new XmlUrlResolver();

Важно установить это свойство до , добавив любые схемы в набор.Вызов Add выполняет «предварительную обработку» схемы, которая включает разрешение любых операторов импорта.Назначение XmlResolver после вызова Add, похоже, не имеет никакого эффекта.

Код приложения должен быть:

var set = new XmlSchemaSet
{
    // Enable resolving of external schemas.
    XmlResolver = new XmlUrlResolver()
};

XmlSchema schema;
using (var reader = XmlReader.Create(
    "https://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd"))
{
    schema = XmlSchema.Read(reader, (sender, e) => Console.WriteLine(e.Message));
}

set.Add(schema);

set.Compile();

ПРИМЕЧАНИЕ Приведенный выше код по-прежнему работаетфактически не приводит к желаемому результату из-за проблем с загрузкой схем из w3.org, однако импортированная схема SAML успешно решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...