我正在尝试从SAML 2.0模式定义集创建XmlSchemaSet
,从此处的协议模式开始: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
一起使用?
答案 0 :(得分:0)
XmlSchemaSet
的默认行为是不尝试解析任何外部模式。为此,必须设置XmlResolver
属性。解析器的首选实现为XmlUrlResolver
:
set.XmlResolver = new XmlUrlResolver();
重要的是在将添加到集合中之前设置此属性。对Add
的调用在模式上执行“预处理”,包括解析所有import语句。呼叫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架构已成功解决。