首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用导入的模式编译XmlSchemaSet

用导入的模式编译XmlSchemaSet
EN

Stack Overflow用户
提问于 2018-11-27 17:22:58
回答 1查看 1.4K关注 0票数 3

我正在尝试针对SAML2.0模式定义创建一个XmlSchemaSet,从这里的协议模式开始:https://docs.oasis-open.org/security/saml/v2.0/saml-schema-protocol-2.0.xsd

代码语言:javascript
复制
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时,将引发以下异常:

代码语言:javascript
复制
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类型出现在模式顶部导入的命名空间中:

代码语言:javascript
复制
<import
    namespace="urn:oasis:names:tc:SAML:2.0:assertion"
    schemaLocation="saml-schema-assertion-2.0.xsd"/>

使用Fiddler,我看不到应用程序试图检索导入的模式。

为什么这些导入语句似乎不使用XmlSchemaSet呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-28 11:46:24

XmlSchemaSet的默认行为是不尝试解析任何外部架构。为此,必须设置XmlResolver属性。转到解析器的实现是XmlUrlResolver

代码语言:javascript
复制
set.XmlResolver = new XmlUrlResolver();

重要的是在添加任何模式之前设置这个属性。对Add的调用对模式执行“预处理”,其中包括解析任何导入语句。调用XmlResolver后分配Add似乎没有任何效果。

应用程序代码需要:

代码语言:javascript
复制
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模式已经成功地解决了。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53504982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档